2017-12-01 24 views
0

적어도 2 개의 데이터베이스에 연결해야하는 Spring-boot 어플리케이션을 작성 중입니다. 도메인을 정의하기 위해 데이터베이스 당 프로젝트 1 개, 서비스를 정의하기 위해 데이터베이스 당 프로젝트 1 개, UI 용 Vaadin 프로젝트 1 개가 있습니다.스프링 부트 및 다중 데이터베이스 연결 : autowire 서비스가 작동하지 않습니다.

- a business domain entity sample 
    @Entity 
    @Table(name="T_PARAMETER") 
    public class Parameter extends BaseIdEntity implements Serializable { 

    @Column(name="par_cls") 
    @NotNull 
    private String parameterClass; 

    @Column(name="par_cd") 
    @NotNull 
    private String parameterCode; 

    @Column(name="par_lan") 
    @NotNull 
    private String language; 

    @Column(name="par_sht_val") 
    @NotNull 
    private String parameterValueShort; 

    @Column(name="par_lng_val") 
    @NotNull 
    private String parameterValueLong; 

- a authentication domain entity sample 

    @Entity 
    @Table(name="t_user", schema="authenticate") 
    public class User extends BaseIdEntity implements Serializable { 

    @Id 
    @Column(name="user_cd") 
    private String userCode; 

    @Column(name="pwd") 
    @NotNull 
    private String password; 

    @Column(name="new_pwd_req") 
    @NotNull 
    private boolean passwordRequired; 

    @Column(name="acc_lck") 
    @NotNull 
    private boolean accountLocked; 

There are repositories onto these 2 entities beans, they just extends the JpaRepository as hereunder: 

public interface ParameterRepository extends JpaRepository<Parameter,Integer>{} 
  • 서비스는 이하로 정의되고

    @Service 
    @Transactional(transactionManager="authenticateTransactionManager") 
    public class ServiceParameterImpl implements ServiceParameter { 
    
    private final static Logger log = LoggerFactory.getLogger(ServiceParameterImpl.class); 
    
    @Autowired 
    private ParameterRepository parameterRepository; 
    
    @Override 
    @Transactional(readOnly=true,transactionManager="authenticateTransactionManager") 
    public List<Parameter> findParameterHeader(String filter) { 
    

    .../...

  • 클라이언트 애플리케이션으로서 :

    @SpringBootApplication 
    @Configuration 
    @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class 
        , HibernateJpaAutoConfiguration.class 
        , DataSourceTransactionManagerAutoConfiguration.class }) 
    @ComponentScan(
        basePackages= { 
          "org.associative.ui" 
          ,"org.associative.service" 
          }) 
    @Import({AssociativityConfiguration.class, AuthenticateConfiguration.class}) 
    public class Application { 
    
    private final static Logger log = LoggerFactory.getLogger(Application.class); 
    
    public static void main(String[] args) { 
        SpringApplication.run(Application.class, args); 
    } 
    

    }

  • 및 구성 :

    @Configuration 
    @EnableTransactionManagement 
    @EntityScan(basePackages= "org.associative.domain.associativity") 
    @EnableJpaRepositories(
        basePackages = "org.associative.domain.associativity.repository" 
        , entityManagerFactoryRef = "associativityEntityManager" 
        , transactionManagerRef = "associativityTransactionManager" 
        ) 
        @ConfigurationProperties(prefix = "db.associativity") 
        public class AssociativityConfiguration { 
    
    private final static Logger log = LoggerFactory.getLogger(AssociativityConfiguration.class); 
    
    @Autowired 
    private Environment env; 
    
    private final static String ASSOCIATIVITY_DRIVER_CLASS_NAME = "db.associativity.classname"; 
    private final static String ASSOCIATIVITY_URL = "db.associativity.connectionUrl"; 
    private final static String ASSOCIATIVITY_USERNAME = "db.associativity.username"; 
    private final static String ASSOCIATIVITY_PASSWORD = "db.associativity.password"; 
    
    private final static String HIBERNATE_DIALECT = "hibernate.dialect"; 
    
    @Bean(name = "associativityDataSource") 
    public DataSource datasource() { 
        DataSource dataSource = DataSourceBuilder.create() 
          .driverClassName(env.getProperty(ASSOCIATIVITY_DRIVER_CLASS_NAME)) 
          .url(env.getProperty(ASSOCIATIVITY_URL)) 
          .username(env.getProperty(ASSOCIATIVITY_USERNAME)) 
          .password(env.getProperty(ASSOCIATIVITY_PASSWORD)).build(); 
    
        if (log.isTraceEnabled()) 
         log.trace(String.format("associativityConfiguration datasource:%s", dataSource.toString())); 
    
        return dataSource; 
    } 
    
    @Bean(name = "associativityEntityManager") 
    @PersistenceContext(unitName = "associativity") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
         EntityManagerFactoryBuilder builder, 
         @Qualifier("associativityDataSource") DataSource dataSource) { 
    
        Map<String, Object> jpaProperties = new HashMap<>(); 
        jpaProperties.put(HIBERNATE_DIALECT, env.getProperty(HIBERNATE_DIALECT)); 
    
        LocalContainerEntityManagerFactoryBean em = builder.dataSource(dataSource) 
          .packages("org.associative.domain.authenticate").persistenceUnit("pu_associativity").properties(jpaProperties) 
          .build(); 
        em.setJpaPropertyMap(jpaProperties); 
    
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 
        em.setJpaVendorAdapter(adapter); // not mandatory definition 
    
        return em; 
    } 
    
    @Bean(name = "associativityTransactionManager") 
    public PlatformTransactionManager associativityTransactionManager(
         @Qualifier("associativityEntityManager") EntityManagerFactory entityManagerFactory) { 
        JpaTransactionManager transactionManager = new JpaTransactionManager(); 
        transactionManager.setEntityManagerFactory(entityManagerFactory); 
        return transactionManager; 
    } 
    

    }

  • @Configuration 
    @EnableTransactionManagement 
    @EntityScan(basePackages= "org.associative.domain.authenticate") 
    @EnableJpaRepositories(
        basePackages = "org.associative.domain.authenticate.repository" 
        , entityManagerFactoryRef = "authenticateEntityManager" 
        , transactionManagerRef = "authenticateTransactionManager" 
        ) 
    @ConfigurationProperties(prefix="db.authenticate") 
    public class AuthenticateConfiguration { 
    
    private final static Logger log = LoggerFactory.getLogger(AuthenticateConfiguration.class); 
    
    @Autowired 
    private Environment env; 
    
    private final static String AUTHENTICATE_DRIVER_CLASS_NAME= "db.authenticate.classname"; 
    private final static String AUTHENTICATE_URL = "db.authenticate.connectionUrl"; 
    private final static String AUTHENTICATE_USERNAME = "db.authenticate.username"; 
    private final static String AUTHENTICATE_PASSWORD = "db.authenticate.password"; 
    private final static String HIBERNATE_DIALECT = "hibernate.dialect"; 
    
    @Primary 
    @Bean(name = "authenticateDataSource") 
    public DataSource datasource() { 
        DataSource dataSource = DataSourceBuilder.create() 
          .driverClassName(env.getProperty(AUTHENTICATE_DRIVER_CLASS_NAME)) 
          .url(env.getProperty(AUTHENTICATE_URL)) 
          .username(env.getProperty(AUTHENTICATE_USERNAME)) 
          .password(env.getProperty(AUTHENTICATE_PASSWORD)) 
          .build(); 
    
        if (log.isTraceEnabled()) log.trace(String.format("authenticateDataSource datasource:%s", dataSource.toString())); 
    
        return dataSource; 
    } 
    
    @Primary 
    @Bean(name="authenticateEntityManager") 
    @PersistenceContext(unitName = "authenticate") 
    //https://raymondhlee.wordpress.com/tag/enablejparepositories/ 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory( 
         EntityManagerFactoryBuilder builder, @Qualifier("authenticateDataSource")DataSource dataSource) { 
    
        Map<String,Object> jpaProperties = new HashMap<>(); 
        jpaProperties.put(HIBERNATE_DIALECT, env.getProperty(HIBERNATE_DIALECT)); 
    
        LocalContainerEntityManagerFactoryBean em = builder 
          .dataSource(dataSource) 
          .packages("org.associative.domain.authenticate") 
          .persistenceUnit("pu_authenticate") 
          .properties(jpaProperties) 
          .build(); 
        em.setJpaPropertyMap(jpaProperties); 
    
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 
        em.setJpaVendorAdapter(adapter); // not mandatory definition 
    
        return em; 
    } 
    
    @Primary 
    @Bean(name="authenticateTransactionManager") 
    public PlatformTransactionManager authenticateTransactionManager(
         @Qualifier("authenticateEntityManager")EntityManagerFactory entityManagerFactory){ 
        JpaTransactionManager transactionManager = new JpaTransactionManager(); 
        transactionManager.setEntityManagerFactory(entityManagerFactory); 
        return transactionManager; 
    } 
    

    } 서비스가 건설에서 autowiring을 사용하여 빌드 할 때

    내가 문제를 직면하고있어 클라이언트 인터페이스 :

    ,515,

    @SpringUI 공용 클래스 ParameterListView는 CssLayout 종속성 필드 'serviceParameter'통해 표현

2017-12-01 14:20:07.151 ERROR o.s.b.SpringApplication Application startup failed 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'parameterControllerImpl': Unsatisfied 

직렬화 {

private final static Logger log = LoggerFactory.getLogger(ParameterListView.class); 

@Autowired 
private ParameterController controller; 

@PostConstruct 
private void initView() { 
    if (log.isTraceEnabled()) log.trace(String.format("initView:%s", "no param")); 

    Grid<Parameter> grid = new Grid<>(); 
    this.addComponent(grid); 

    grid.setItems(controller.getParameterHeader("")); 

    grid.addColumn(Parameter::getParameterClass); 
    grid.addColumn(Parameter::getParameterValueShort); 
    grid.addColumn(Parameter::getParameterValueLong); 
구현 연장; 중첩 예외는 org.springframework.beans.factory.UnsatisfiedDependencyException : 오류 이름 'serviceParameterImpl'bean 작성 : 불만족 의존성 필드 'parameterRepository'통해 표현; 예외는 org.springframework.beans.factory.BeanCreationException : 이름이 'parameterRepository'인 빈을 생성하는 중 오류가 발생했습니다 : 초기화 메소드가 실패했습니다. 아니 관리되는 형식 : 클래스 org.associative.domain.associativity.Parameter 나는 이미 여러 데이터베이스 연결을 내가했기 때문에를 해결하기 위해 많은 시간을 보냈다

상자의 예외는 java.lang.IllegalArgumentException가있다 이 문제는 정의 문제에서 오는 것이라고 생각하지만 지금은 확실하지 않습니다. 그래서이 문제를 해결하려면 어떻게해야합니까?

대단히 감사합니다.

+0

성령 :

문제를 해결해야한다. [Minimal, Complete, Verifiable Examples] (http://stackoverflow.com/help/mcve)를보십시오. 주의 깊게 읽으십시오. 특히 _ "Minimal"_에 관한 부분 – Clijsters

답변

0

스택 추적의 마지막 줄은 단서입니다 : Not a managed type: class org.associative.domain.associativity.Parameter. Hibernate는 Parameter 엔티티에 대해 모른다.

LocalContainerEntityManagerFactoryBean에서 스캔 할 패키지를 org.associative.domain.authenticate으로 설정합니다. Parameter 엔티티가이 패키지에 없습니다.

.packages("org.associative.domain.authenticate", "org.associative.domain.associativity")