powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring, Session Bean
12 сообщений из 12, страница 1 из 1
Spring, Session Bean
    #39168635
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться...

Приложение на Spring(SpringSecurity ...)

Хочу использовать Session Bean когда пользователь залогинивается.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        ...
        @Autowired
	private AppParams appParams; //это мой Session Bean
	
	@Override
	@Transactional(readOnly = true)
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            ...
            appParams.setUnitAppParam(user.getUnit());
            ...

Посмотрел как это делается: Making a Spring bean session scoped
Теперь пробую настроить у себя:
AppConfig.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
...
	@Bean
	public DataSource dataSource()
	{
		BasicDataSource dataSource = new BasicDataSource();
		dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
		dataSource.setUrl(env.getProperty("jdbc.url"));
		dataSource.setUsername(env.getProperty("jdbc.username"));
		dataSource.setPassword(env.getProperty("jdbc.password"));
		return dataSource;
	}
...
    @Bean(name = "appParams")
    @Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public AppParams getParams() {
    	return new AppParams();
		//AppParams object = AppParams.getInstance();
		//return object;		
    }
    
    @Bean 
    public RequestContextListener requestContextListener(){
        return new RequestContextListener();
    } 
    
    @Bean
    public CustomScopeConfigurer customScope () {
        CustomScopeConfigurer configurer = new CustomScopeConfigurer ();
        Map<String, Object> sessionScope = new HashMap<String, Object>();
        sessionScope.put("session", new SimpleThreadScope ());
        configurer.setScopes(sessionScope);

        return configurer;
    }
...


После добавления @Bean public CustomScopeConfigurer customScope () в AppConfig.java
Получаю ERROR при старте TomCat:
Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.NullPointerException

Хотя в AppConfig.java есть public DataSource dataSource()

Как можно исправить ситуацию? В чем я ошибся?
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168643
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wvetal,

может он не может найти одно из этих
env.getProperty("jdbc.driverClassName")
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168652
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Session Bean это EJB, а в Spring Session это всего лишь scope для bean. Поэтому называется session scoped bean.
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168656
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rema174wvetal,

может он не может найти одно из этих
env.getProperty("jdbc.driverClassName")
Думаю, не в этом причина - потому-что до добавления CustomScopeConfigurer DataSource работал и данные с базы получал.
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168659
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczSession Bean это EJB, а в Spring Session это всего лишь scope для bean. Поэтому называется session scoped bean.
Хорошо, тогда как мне правильно использовать session scoped bean?
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168673
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetal,

Что такое env и почему он не null?
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168676
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczwvetal,

Что такое env и почему он не null?
Код: java
1.
2.
@Autowired
private Environment env;


application.properties:
jdbc.driverClassName=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@10.0.0.10:1521:xe
jdbc.username=user
jdbc.password=password
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168683
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полный конфиг выглядит так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
@Configuration
@ComponentScan(basePackages = { "org.abc.registry" }, excludeFilters = {
		//@ComponentScan.Filter(value = Controller.class, type = FilterType.ANNOTATION),
		//@ComponentScan.Filter(value = EnableWebMvc.class, type = FilterType.ANNOTATION)
 @ComponentScan.Filter(pattern = { "org.abc.registry.web.*", "org.abc.registry.rest.*" }, type = FilterType.REGEX)

})
@EnableScheduling
@EnableAspectJAutoProxy
@EnableCaching
@EnableAsync
@EnableJpaRepositories(basePackages = { "org.abc.registry.repository" })
@EnableTransactionManagement
@PropertySource(value = { "classpath:application.properties" })
public class AppConfig
{

	@Autowired
	private Environment env;

	@Bean
	public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer()
	{
		return new PropertySourcesPlaceholderConfigurer();
	}

	@Bean
	public PlatformTransactionManager transactionManager()
	{
		EntityManagerFactory factory = entityManagerFactory().getObject();
		return new JpaTransactionManager(factory);
	}

	@Bean(name = "entityManagerFactory")
	public LocalContainerEntityManagerFactoryBean entityManagerFactory()
	{
		LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();

		HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
		vendorAdapter.setGenerateDdl(Boolean.TRUE);
		vendorAdapter.setShowSql(Boolean.TRUE);

		factory.setDataSource(dataSource());
		factory.setJpaVendorAdapter(vendorAdapter);
		factory.setPackagesToScan("org.abc.registry.entity");

		Properties jpaProperties = new Properties();
		jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
		factory.setJpaProperties(jpaProperties);

		factory.afterPropertiesSet();
		factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
		return factory;
	}

	@Bean
	public HibernateExceptionTranslator hibernateExceptionTranslator()
	{
		return new HibernateExceptionTranslator();
	}

	
	@Bean
	public DataSource dataSource()
	{
		BasicDataSource dataSource = new BasicDataSource();
		dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
		dataSource.setUrl(env.getProperty("jdbc.url"));
		dataSource.setUsername(env.getProperty("jdbc.username"));
		dataSource.setPassword(env.getProperty("jdbc.password"));
		return dataSource;
	}
	
	private Properties getHibernateProperties() {
    	Properties properties = new Properties();
    	properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
    	properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
    	properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));//create 	      	
    	return properties;
    }
	
	@Autowired
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(DataSource dataSource) {
    	LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
    	sessionBuilder.addProperties(getHibernateProperties());
    	sessionBuilder.addAnnotatedClasses(User.class);
    	sessionBuilder.addAnnotatedClasses(Role.class);
    	return sessionBuilder.buildSessionFactory();
    }
		
	/*@Autowired
	@Bean(name = "sessionFactory")
	public FactoryBean<SessionFactory> sessionFactory() {
	  HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
	  factory.setEntityManagerFactory(entityManagerFactory().getObject());
	  return factory;
	}*/
	
	@Autowired
	@Bean(name = "transactionManager")
	public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
		HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
		return transactionManager;
	}
    
    @Autowired
    @Bean(name = "userDao")
    public UserDAO getUserDao(SessionFactory sessionFactory) {
    	return new UserDAOImpl(sessionFactory);
    }
    
    @Autowired
    @Bean(name = "roleDao")
    public RoleDAO getRoleDao(SessionFactory sessionFactory) {
    	return new RoleDAOImpl(sessionFactory);
    }

	@Bean
	public CacheManager cacheManager()
	{
		return new ConcurrentMapCacheManager();
	}
	
    @Bean(name = "appParams")
    @Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public AppParams getParams() {
    	return new AppParams();
		//AppParams object = AppParams.getInstance();
		//return object;		
    }
    
    @Bean 
    public RequestContextListener requestContextListener(){
        return new RequestContextListener();
    } 
    
    @Bean
    public CustomScopeConfigurer customScope () {
        CustomScopeConfigurer configurer = new CustomScopeConfigurer ();
        Map<String, Object> sessionScope = new HashMap<String, Object>();
        sessionScope.put("session", new SimpleThreadScope ());
        configurer.setScopes(sessionScope);

        return configurer;
    }

}



Может так проблема станет виднее?
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168690
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetalМожет так проблема станет виднее?
Проблема станет виднее, если посмотреть на stacktrace и определить в какой строке возник NPE.
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168744
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rema174wvetal,

может он не может найти одно из этих
env.getProperty("jdbc.driverClassName")Blazkowiczwvetal,

Что такое env и почему он не null?BlazkowiczПроблема станет виднее, если посмотреть на stacktrace и определить в какой строке возник NPE.Да, вы оказались правы, проблема в этом.
Когда ввел параметры руками:
Код: java
1.
2.
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
...

TomCat запускается без ошибок.

Но, тогда вопрос - раньше же env.getProperty("jdbc.driverClassName") работал. Почему добавление CustomScopeConfigurer поламало env?
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168755
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetalПочему добавление CustomScopeConfigurer поламало env?
Надо лог смотреть. Возможно у бинов на столько разный scope что инъекция перестала работать. Возможно, есть какие-то особенность инъекции для своего Scope.
...
Рейтинг: 0 / 0
Spring, Session Bean
    #39168894
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверяю дальше как работает мой session scoped bean.

Идея такая:
В session scoped bean (appParams) я хочу хранить некоторые данные пользователя, которые инициализируются(загружаются из базы) когда пользователь входит в систему.
Код: java
1.
2.
3.
4.
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
...
appParams.setUnit(user.getUnit()); //работает
appParams.getUnit(); //работает


Дальше я хочу использовать эти данные. И мне нужен этот session scoped bean, чтоб каждый раз не лезть в базу.

Теперь, когда срабатывает метод на RestController-е, и я пытаюсь извлечь то, что инициализировал при входе в систему - получаю 0, вместо ожидаемого значения.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
        @Autowired
	private AppParams appParams;
 
	
    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public ResponseEntity<Void> create( ...) {

         appParams.getUnit(); // Почему здесь возвращается 0?
  


Почему на контроллере возвращается 0?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring, Session Bean
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]