2017-08-28 26 views
0

我有两个项目,一个使用DAO类和模型,另一个休息控制器访问多张数据源用的JdbcTemplate导致错误

项目A:DAO类+型号

项目B:休息控制器


项目A

application.properties:

spring.abcDatasource.url= 
spring.abcDatasource.username= 
spring.abcDatasource.password= 
spring.abcDatasource.driver-class-name=oracle.jdbc.driver.OracleDriver 


spring.xyzDatasource.url= 
spring.xyzDatasource.username= 
spring.xyzDatasource.password= 
spring.xyzDatasource.driver-class-name=oracle.jdbc.driver.OracleDriver 


spring.datasource.initialize=false 

DBConfiguration.java

@Configuration 
public class DBConfiguration { 

    @Primary 
    @Bean(name = "abcDS") 
    @ConfigurationProperties(prefix = "spring.abcDatasource") 
    public DataSource abcDS() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "abcJdbc") 
    public JdbcTemplate abcJdbcTemplate(@Qualifier("abcDS") DataSource abcDS) { 
     return new JdbcTemplate(abcDS); 
    } 

    @Bean(name = "xyzDS") 
    @ConfigurationProperties(prefix = "spring.xyzDatasource") 
    public DataSource xyzDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "xyzJdbc") 
    public JdbcTemplate ebsJdbcTemplate(@Qualifier("xyzDS") DataSource xyzDatasource) { 
     return new JdbcTemplate(xyzDatasource); 
    } 


} 

AlphaDAO.Java

@Repository 
public class AlphaDAO{ 

    @Autowired 
    @Qualifier("abcJdbc") 
    private JdbcTemplate abcJdbc; 

    @Autowired 
    @Qualifier("xyzJdbc") 
    private JdbcTemplate xyzJdbc; 

    SqlParameterSource namedParameters; 



    public Collection<Alpha> findAll(String owner){ 

     String sql = "SELECT * from alpha where OWNER in (:owner)" ; 

     NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(abcJdbc.getDataSource()); 


     namedParameters = new MapSqlParameterSource("owner", owner); 


     List<Alpha> list = namedParameterJdbcTemplate.query(sql,namedParameters, 
       new BeanPropertyRowMapper(Alpha.class)); 

     return list; 
    } 

项目B休息控制器:

AlphaServiceApplication.java

@SpringBootApplication 
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 
public class AlphaServiceApplication extends SpringBootServletInitializer implements WebApplicationInitializer { 


    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 
     return builder.sources(AlphaServiceApplication.class); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(AlphaServiceApplication.class, args); 
    } 
} 

AlphaServic eController.java

@RestController 
public class AlphaServiceController { 

    private static final Logger logger = LoggerFactory.getLogger(AlphaServiceController.class); 

    @Autowired 
    AlphaDAO dao; 

    @CrossOrigin(origins = "http://localhost:4200") 
    @RequestMapping("/alpha") 
    public Collection<Alpha> index(@RequestBody String owner) { 
     return dao.findAll(owner); 
    } 

如果我尝试运行其他控制器我收到错误说


应用程序未能启动


说明:

场道在com.xyz.web.wip.AlphaService.AlphaServiceController中需要一个类型为'com.xyz.comp.wip.alpha Comp.dao.AlphaDAO'找不到。

操作:

考虑您的配置定义类型的豆 'com.xyz.comp.wip.alphaComp.dao.AlphaDAO'。

回答

1

AlphaDao您的AlphaDao类没有多大意义,您试图autowire两个字段,但你仍然有一个构造函数。
Spring不能构建对象,因为构造函数中没有限定符。
你既可以做构造函数注入,也可以做字段注入,但不应该同时使用两者。 我会推荐使用构造函数注入。

@Repository 
public class AlphaDAO{ 

    private final JdbcTemplate abcJdbc; 
    private final JdbcTemplate xyzJdbc; 

    @Autowired 
    public AlphaDAO(
      @Qualifier("abcJdbc") JdbcTemplate abcJdbc, 
      @Qualifier("xyzJdbc") JdbcTemplate xyzJdbc){ 
     this.abcJdbc = abcJdbc; 
     this.xyzJdbc = xyzJdbc; 
    } 

也从控制器中删除您的@Bean方法。

+0

我在进行这些更改后收到相同的错误 – Jan69

0

由于DAO类和Rest Controller位于不同的包中。向@SpringBootApplication注释添加了scanBasePackages,其中一级可以正常工作。

AlphaServiceApplication.java 

@SpringBootApplication(scanBasePackages = { "com.xyz" }) 
相关问题