2016-12-20 3 views
0

Я знаю, что миллиарды вопросов с этой проблемой, но я не могу решить мою проблему. У меня есть приложение с Spring + Hibernate. Hibernate имеет 2 конфигурации (для клиентских и административных баз данных). Спящий режим клиента поддерживает многопользовательский подход с использованием DATABASE. Также я использую Spring Security.
Это мой класс для решимости арендатора ID:Autowired @Service имеет значение null не везде

@Component 
public class MyTenantIdentifierResolver implements CurrentTenantIdentifierResolver { 

    @Autowired 
    private UserService userService; 

    public String resolveCurrentTenantIdentifier() { 
     User u = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     com.lspsystem.model.User us = userService.getByLogin(u.getUsername()); 
     return us.getCompany().getTenantId(); 
    } 

    public boolean validateExistingCurrentSessions() { 
     return true; 
    } 
} 

Это мой UserService:

@Service 
public class UserServiceImpl implements UserService { 

    @Autowired 
    private UserDAO userDAO; 

    public User get(Integer id) { 
     return userDAO.get(id); 
    } 

    public boolean delete(Integer id) { 
     return userDAO.delete(id); 
    } 

    public void update(User u) { 
     userDAO.update(u); 
    } 

    public List<User> getAll(User u) { 
     return userDAO.getAllUsers(); 
    } 

    public User getByLogin(String login) { 
     return userDAO.getByLogin(login); 
    } 
} 

Моего вопрос: Почему UserService в MyTenantIdResolver всегда null? Но, например, в следующем классе (из безопасности) это не null.

@Service 
public class UserDetailsServiceImpl implements UserDetailsService { 

    @Autowired 
    private UserService userService; 

    public User loadUserByUsername(String s) throws UsernameNotFoundException { 
     com.lspsystem.model.User u = userService.getByLogin(s); 
     return new User(u.getEmail(), u.getPassword(), true, true, true, true, getGrantedAuthorities(u)); 
    } 

    @Autowired 
    public UserDetailsServiceImpl(UserService userService) { 
     this.userService = userService; 
    } 

    private List<GrantedAuthority> getGrantedAuthorities(com.lspsystem.model.User u) { 
     List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     return authorities; 
    } 
} 

Обратите внимание, что UserService и MyTenantIdResolver принадлежат к разным Hibernate конфиги.

ОБНОВЛЕНО
Клиент зимуют конфигурации:

@Configuration 
@EnableTransactionManagement 
@PropertySource(value = {"classpath:customerHibernate.properties"}) 
public class RemoteDBHibernateConfig { 

@Autowired 
private Environment environment; 

@Bean(name = "customerSessionFactory") 
public SessionFactory sessionFactory() throws IOException{ 
    LocalSessionFactoryBean builder = 
      new LocalSessionFactoryBean(); 
    builder.setDataSource(dataSource1()); 
    builder.setPackagesToScan("com.lspsystem.model"); 
    builder.setHibernateProperties(hibernateProperties()); 
    builder.afterPropertiesSet(); 

    return builder.getObject(); 
} 

@Bean("defaultDS") 
public DataSource dataSource1() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
    dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
    dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
    dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 
    return dataSource; 
} 

private Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
    properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
    properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
    properties.put("hibernate.multiTenancy", environment.getRequiredProperty("hibernate.multiTenancy")); 
    properties.put("hibernate.multi_tenant_connection_provider", environment.getRequiredProperty("hibernate.multi_tenant_connection_provider")); 
    properties.put("hibernate.tenant_identifier_resolver", environment.getRequiredProperty("hibernate.tenant_identifier_resolver")); 
    return properties; 
} 

@Bean 
@Autowired 
public HibernateTransactionManager transactionManager() throws IOException{ 
    HibernateTransactionManager txManager = new HibernateTransactionManager(); 
    txManager.setSessionFactory(sessionFactory()); 
    return txManager; 
}} 

Администратор зимуют конфигурации:

@Configuration 
@EnableTransactionManagement 
@PropertySource(value = {"classpath:adminHibernate.properties"}) 
public class AdminDBHibernateConfig { 

@Autowired 
private Environment environment; 

@Bean(name = "adminSessionFactory") 
public SessionFactory sessionFactory() throws IOException { 
    LocalSessionFactoryBean builder = 
      new LocalSessionFactoryBean(); 
    builder.setDataSource(dataSource()); 
    builder.setPackagesToScan("com.lspsystem.model"); 
    builder.setHibernateProperties(hibernateProperties()); 
    builder.afterPropertiesSet(); 

    return builder.getObject(); 
} 

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(environment.getRequiredProperty("admin.jdbc.driverClassName")); 
    dataSource.setUrl(environment.getRequiredProperty("admin.jdbc.url")); 
    dataSource.setUsername(environment.getRequiredProperty("admin.jdbc.username")); 
    dataSource.setPassword(environment.getRequiredProperty("admin.jdbc.password")); 
    return dataSource; 
} 

private Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put("hibernate.dialect", environment.getRequiredProperty("admin.hibernate.dialect")); 
    properties.put("hibernate.show_sql", environment.getRequiredProperty("admin.hibernate.show_sql")); 
    properties.put("hibernate.format_sql", environment.getRequiredProperty("admin.hibernate.format_sql")); 
    properties.put("hibernate.hbm2dll.auto", environment.getRequiredProperty("admin.hibernate.hbm2ddl.auto")); 
    return properties; 
} 

@Bean 
@Autowired 
public HibernateTransactionManager transactionManager() throws IOException{ 
    HibernateTransactionManager txManager = new HibernateTransactionManager(); 
    txManager.setSessionFactory(sessionFactory()); 
    return txManager; 
}} 

Веб-приложение конфигурации:

@Configuration 
@EnableWebMvc 
@Import(SecurityConfiguration.class) 
public class WebApplicationConfig extends WebMvcConfigurerAdapter{ 

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
} 

@Bean 
public InternalResourceViewResolver viewResolver(){ 
    InternalResourceViewResolver view = new InternalResourceViewResolver(); 
    view.setViewClass(JstlView.class); 
    view.setPrefix("/WEB-INF/jsp/"); 
    view.setSuffix(".jsp"); 
    return view; 
}} 

UserDAO, например:

@Repository 
public class UserDAOImpl implements UserDAO { 

@Autowired 
@Qualifier("adminSessionFactory") 
private SessionFactory sessionFactory; 

public com.lspsystem.model.User get(Integer id) { 
    Session session = sessionFactory.openSession(); 
    User u = (User)session.load(User.class, id); 
    return u; 
} 

public User getByLogin(String login) { 
    Session session = sessionFactory.openSession(); 
    Query q = session.createQuery("SELECT u FROM User u WHERE u.email = :email"); 
    q.setParameter("email", login); 
    User u = (User)q.list().get(0); 
    return u; 
}} 
+0

Предоставьте свои классы/файлы конфигурации. –

+0

Да, пожалуйста, ваш файл конфигурации. Во всяком случае, просто идея: как одна служба может иметь две стойкости в одно и то же время? (Если я понял вашу ситуацию exposal) – Zorglube

+0

Мои конфиги добавлены. –

ответ

2

Это не может быть правдой! @Autowire заставит поле быть непустым. Таким образом, единственный случай, когда userService=null, когда MyTenantIdentifierResolver не является весенним бобом!

Сделайте экземпляр MyTenantIdentifierResolver весенней фасоли.

+0

Извините, вы имеете в виду добавить аннотацию @Bean? –

+0

@ArtemP. Нет, класс настроен хорошо. Найдите весеннюю конфигурацию, чтобы узнать, почему класс не используется в качестве пружинного компонента. –

Смежные вопросы