적어도 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
직렬화 {
구현 연장; 중첩 예외는 org.springframework.beans.factory.UnsatisfiedDependencyException : 오류 이름 'serviceParameterImpl'bean 작성 : 불만족 의존성 필드 'parameterRepository'통해 표현; 예외는 org.springframework.beans.factory.BeanCreationException : 이름이 'parameterRepository'인 빈을 생성하는 중 오류가 발생했습니다 : 초기화 메소드가 실패했습니다. 아니 관리되는 형식 : 클래스 org.associative.domain.associativity.Parameter 나는 이미 여러 데이터베이스 연결을 내가했기 때문에를 해결하기 위해 많은 시간을 보냈다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);
상자의 예외는 java.lang.IllegalArgumentException가있다 이 문제는 정의 문제에서 오는 것이라고 생각하지만 지금은 확실하지 않습니다. 그래서이 문제를 해결하려면 어떻게해야합니까?
대단히 감사합니다.
성령 :
이
문제를 해결해야한다. [Minimal, Complete, Verifiable Examples] (http://stackoverflow.com/help/mcve)를보십시오. 주의 깊게 읽으십시오. 특히 _ "Minimal"_에 관한 부분 – Clijsters