Подтвердить что ты не робот

Получение Spring Ошибка "Bean с именем 'x' должно быть типа [y], но на самом деле было типа [$ Proxy]" в Jenkins

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

У меня есть проект 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, и что я могу только autwire для интерфейса вместо конкретного класса... но это не так, потому что я могу запустить мой код отлично за пределами Jenkins.

Любые идеи? Благодарю.

4b9b3361

Ответ 1

Отрывок из комментариев, высказанных выше:

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

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

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

Чтобы сократить длинную историю, запустите прокси-сервер класса CGLIB, и все будет хорошо:

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