2016-12-20 1 views
0

그 문제로 수십억의 질문을 알고 있지만 문제를 해결할 수 없습니다. 나는 봄 + 최대 절전 모드로 애플 리케이션을 가지고. Hibernate는 2 개의 설정 (고객 및 관리 데이터베이스 용)을 가지고있다. 고객의 최대 절전 모드는 DATABASE 방식으로 멀티 테넌시를 지원합니다. 또한 스프링 보안을 사용합니다.
이 세입자 아이디 해결을위한 내 수업은 다음과 같습니다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이 아닙니다. UserService 및 MyTenantIdResolver 다른 최대 절전 CONFIGS에 속하는

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

참고.

업데이트]
고객 최대 절전 모드 설정 :

@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

예. 설정 파일을 보내주십시오. 아무리 생각해 보면 : 단일 서비스가 동시에 두 개의 지속성 conf를 가질 수있는 방법은 무엇입니까? (귀하의 상황을 이해할 수있는 경우) – Zorglube

+0

내 구성이 추가되었습니다. –

답변

2

사실 일 수는 없습니다. @Autowire은 필드가 널이 아니도록합니다. 따라서 userService=null을 갖는 유일한 경우는 MyTenantIdentifierResolver이 스프링 빈이 아닐 때입니다!

MyTenantIdentifierResolver의 인스턴스를 spring-bean으로 설정하십시오.

+0

죄송합니다, @Bean annotation을 추가 하시겠습니까? –

+0

@ArtemP. 아니요, 클래스가 잘 구성되었습니다. 스프링 구성을 검색하여 클래스가 스프링 빈으로 사용되지 않는 이유를 찾으십시오. –

관련 문제