2016-12-19 7 views
3

Я переношу активное веб-приложение Spring на весеннюю загрузку (1.4.2).Spring-Boot игнорирует аннотацию @Qualifier

Бобы определены в XML, поскольку он загружается с помощью @ImportResource.

4 из того, что я запускаю, является экземпляром того же объекта BasicDataSource.

Чтобы указать весну, на которую нужно загрузить, я установил идентификатор для каждого из них и используя @Qualifier для привязки правильного компонента к переменной.

Но это, кажется, что весна игнорирует мое @Qualifier и не бросать «Нет квалификационную боб типа доступного„javax.sql.DataSource“: ожидается, одного согласующего боба, но нашел 4: DataSource1, DataSource2, DataSource3, DataSource4»

PS - Обратите внимание, что класс, который имеет @Qualifier, является абстрактным классом, а класс, который не создает экземпляр, является расширяющимся классом, однако @Qualifier имеет @Inherited.

XML

<beans 
    xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:task="http://www.springframework.org/schema/task" 
xmlns:cache="http://www.springframework.org/schema/cache" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd 
    http://www.springframework.org/schema/jee 
    http://www.springframework.org/schema/jee/spring-jee-3.2.xsd 
    http://www.springframework.org/schema/task 
    http://www.springframework.org/schema/task/spring-task-3.2.xsd 
    http://www.springframework.org/schema/cache 
    http://www.springframework.org/schema/cache/spring-cache-3.2.xsd 
    http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring 
    http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd"> 

<context:load-time-weaver aspectj-weaving="on"/> 
<cache:annotation-driven mode="aspectj"/> 
<context:property-override location="file:/app/config/dataSourceOverride.cfg"/> 
<context:annotation-config /> 

<bean id="DataSource1" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="userId" value="4" /> 
</bean> 

<bean id="DataSource2" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="userId" value="3" /> 
</bean> 

<bean id="DataSource3" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="userId" value="2" /> 
</bean> 

<bean id="DataSource4" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="userId" value="1" /> 
</bean> 

Весна загрузки приложения основной

package com.app; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.ImportResource; 


@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan("com.app") 
@ImportResource("com/app/startup/spring.xml") 
public class SpringBootServer { 

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

    } 
} 

Абстрактный класс

public abstract class GenericDao { 

    public GenericDao() { 

    } 

    private Logger logger = LoggerFactory.getLogger(GenericDao.class); 

    @Autowired 
    @Qualifier("DataSource1") 
    protected BasicDataSource dataSource1Impl; 

    @Autowired 
    @Qualifier("DataSource2") 
    protected BasicDataSource dataSource2Impl; 

    @Autowired 
    @Qualifier("DataSource3") 
    protected BasicDataSource dataSource3Impl; 

    @Autowired 
    @Qualifier("DataSource4") 
    protected BasicDataSource dataSource4Impl; 
} 

Solid Calss

@Component("widgetsDao") 
public class WidgetsDao extends GenericDao { 

##Some methods## 

} 

Исключение

*************************** 
APPLICATION FAILED TO START 
*************************** 

Description: 

Field dataSource1Impl in com.app.dal.GenericDao required a single bean, but 4 were found: 
    - DataSource1: defined in class path resource [com/app/startup/app-spring.xml] 
    - DataSource2: defined in class path resource [com/app/startup/app-spring.xml] 
    - DataSource3: defined in class path resource [com/app/startup/app-spring.xml] 
    - DataSource4: defined in class path resource [com/app/startup/app-spring.xml] 


Action: 

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed 

Что может сделать весной, чтобы игнорировать мои @Qualifier аннотацию ??

С благодарностью.

+0

В вашей XML-конфигурации нет определителя. –

+0

Идентификатор служит как имя классификатора – Ronco

+0

Я не знаю, почему это не работает для вас, но обратите внимание, что если имена бинов соответствуют именам переменных, вам даже не нужны квалификаторы. Это '@Autowired BasicDataSource datasource4' будет подключаться к компоненту с именем' datasource4'. – slim

ответ

2

Я видел ту же ошибку при использовании нескольких источников данных, и после того, как одна из компонентов источника данных была «первичной», проблема, казалось, была решена, и тогда я смог автоподготовку правильного компонента с помощью аннотации @Qualifier.

Документация Spring Boot here согласна с этим, заявив, что при использовании нескольких источников данных один из компонентов источника данных должен быть первичным.

Я сконфигурировал свои бобы на Java с помощью аннотации @Bean, поэтому я использовал @Primary аннотацию, чтобы сделать один основной. Но если вы настраиваете в XML, то похоже, что элемент в XML имеет необязательный «первичный» атрибут, который можно использовать при настройке компонентов в XML.

0

Как указано в Jake, @Primary аннотация должна быть добавлена, по крайней мере, для устранения этой ошибки. Плюс:

Если вы извлекаете свои свойства источника данных из внешнего файла, запустите свойства первичного источника данных (т. Е.url, user, pass и т. д.) с spring.datasource, чтобы переопределить внутренний источник данных Spring Boot по умолчанию, который является Derby, HSQL или так в зависимости от вашей конфигурации.

Смежные вопросы