2016-12-20 8 views
0

私はその問題で数十億の問題を知っていますが、私は私の問題を解決できません。私はSpring + Hibernateでappを持っています。 Hibernateには2つのconfigs(顧客データベースと管理データベース用)があります。顧客の休止状態をサポートするマルチテナンシーとDATABASEアプローチ。また、私は春のセキュリティを使用します。
それはテナント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); 
    } 
} 

私の質問MyTenantIdResolverUserServiceは常に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は異なる休止のconfigsに属していることに注意してください。

UPDATED
カスタマー・休止状態の設定:

@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; 
}} 

Webアプリケーションの設定:

@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

はい、あなたの設定ファイルをお願いします。とにかく単なるアイデア:どのようにして1つのサービスが同時に2つのパーシスタンスconfを持つことができますか? (私があなたの状況を理解している場合) – Zorglube

+0

私の設定が追加されました。 –

答えて

2

これは当てはまりません! @Autowireは、フィールドがnullでないように強制します。したがって、userService=nullを持つ唯一のケースは、MyTenantIdentifierResolverが春の豆でない場合です。

MyTenantIdentifierResolverのインスタンスをspring-beanにします。

+0

申し訳ありません、あなたは@Beanアノテーションを追加することを意味しますか? –

+0

@ArtemP。いいえ、クラスは正しく設定されています。スプリング構成を検索して、クラスがスプリング・ビーンとして使用されていない理由を調べます。 –

関連する問題