Получение Spring Error "Бин с именем 'x' должен иметь тип [y], но на самом деле имел тип [$ Proxy]" в Jenkins - PullRequest
19 голосов
/ 06 декабря 2011

Я уже некоторое время отлаживаю это, и я надеюсь, что кто-то мог бы пролить немного света здесь.

У меня есть проект Maven, который добавлен в Jenkins с использованием JDK 1.6. Я использую AOP в этом проекте для обработки транзакций базы данных.

Когда я запускаю сборку в Jenkins, мой тестовый сценарий не выполняется со следующими исключениями: -

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'dataHandlerClassificationImpl': 
Injection of resource dependencies failed; nested exception is 
org.springframework.beans.factory.BeanNotOfRequiredTypeException: 
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData], 
but was actually of type [$Proxy17]
    ...
    ...
Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: 
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData], 
but was actually of type [$Proxy17]
    ...
    ...

Класс DataHandlerClassificationImpl выглядит примерно так: -

@Service
public class DataHandlerClassificationImpl extends DataHandler {

    @Resource(name="writerDataLocationImpl")
    private WriterData writerData;

    ...
}       

WriterData - это интерфейс с несколькими реализациями.

Я могу без проблем выполнить код из IDE. Чтобы определить, является ли это проблемой Maven или Jenkins, я перешел к папке проекта Jenkins с помощью командной строки и смог запустить mvn test без каких-либо ошибок.

Я знаю, что ошибка прокси-сервера имеет отношение к AOP и что я могу только автоматически подключаться к интерфейсу, а не к конкретному классу ... но здесь это не так, поскольку я могу нормально запускать свой код вне Jenkins .

Есть идеи? Благодарю.

1 Ответ

43 голосов
/ 06 декабря 2011

Выдержка из комментария вопроса выше:

Вы используете Cobertura, Sonar или другой инструмент для работы с кодом на Jenkins? Обратите внимание, что mvn site также может быть настроен на включение отчета Cobertura в сгенерированный site.

Проблема с Cobertura заключается в том, что он выполняет довольно тяжелые инструментарии байт-кода, включая добавление некоторых пользовательских интерфейсов. Когда запускается Spring, он генерирует прокси для бобов. Если у компонента есть хотя бы один интерфейс, он использует стандартный прокси Java. В противном случае он пытается создать прокси на основе классов.

Полагаю, в вашем случае использовался прокси класса CGLIB, но после инструментария Cobertura Spring возвращается к java прокси. Это вызвало ошибку запуска, так как ожидаемый класс внедрения зависимостей (или подкласс CGLIB).

Короче говоря, используйте прокси класса CGLIB, и все будет в порядке:

<aop:config proxy-target-class="true"/>
...