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

Приложение на 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
11.02.2016, 14:49
    #39168643
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, Session Bean
wvetal,

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

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

Что такое env и почему он не null?
...
Рейтинг: 0 / 0
11.02.2016, 15:18
    #39168676
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, Session Bean
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
11.02.2016, 15:30
    #39168683
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, Session Bean
Полный конфиг выглядит так:

Код: 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
11.02.2016, 15:32
    #39168690
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, Session Bean
wvetalМожет так проблема станет виднее?
Проблема станет виднее, если посмотреть на stacktrace и определить в какой строке возник NPE.
...
Рейтинг: 0 / 0
11.02.2016, 16:16
    #39168744
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, Session Bean
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
11.02.2016, 16:29
    #39168755
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, Session Bean
wvetalПочему добавление CustomScopeConfigurer поламало env?
Надо лог смотреть. Возможно у бинов на столько разный scope что инъекция перестала работать. Возможно, есть какие-то особенность инъекции для своего Scope.
...
Рейтинг: 0 / 0
11.02.2016, 18:15
    #39168894
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, Session Bean
Проверяю дальше как работает мой 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring, Session Bean / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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