У нас есть приложение, использующее Spring MVC.Недавно мы изменили процесс сборки, чтобы использовать Maven 3.0.5 вместо Maven 3.2.3 (для этого нет соответствующей причины), и начали испытывать исключения, развертываемые в WebLogic.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected org.springframework.security.authentication.AuthenticationManager com.es3.ers.controller.AuthenticationController.authManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.es3.ers.filter.AuthenticationTokenProcessingFilter com.es3.ers.config.SecurityConfig.authenticationTokenProcessingFilter; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationTokenProcessingFilter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.security.authentication.AuthenticationManager com.es3.ers.filter.AuthenticationTokenProcessingFilter.authenticationManager; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'authenticationManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
Некоторые исследования привели к проблемев нашем коде, который мы решили разрешить, чтобы приложение снова заработало, но это действительно заставило меня задуматься о том, почему версия Maven так повлияет на Spring.
Я сравнил версии, построенные на 3.0.5 и 3.2.3 и кроме временных меток в файле MANIFEST различий не было.Затем я посмотрел на структуру архива и заметил, что в версии 3.0.5 было три файла (связанных с ошибкой):
$ unzip -t ers.war | grep -E "(AuthenticationController|AuthenticationTokenProcessingFilter|SecurityConfig)\.class"
testing: WEB-INF/classes/com/es3/ers/controller/AuthenticationController.class OK
testing: WEB-INF/classes/com/es3/ers/filter/AuthenticationTokenProcessingFilter.class OK
testing: WEB-INF/classes/com/es3/ers/config/SecurityConfig.class OK
В 3.2.3 были те же три файла:
$ unzip -t ers.war | grep -E "(AuthenticationController|AuthenticationTokenProcessingFilter|SecurityConfig)\.class"
testing: WEB-INF/classes/com/es3/ers/filter/AuthenticationTokenProcessingFilter.class OK
testing: WEB-INF/classes/com/es3/ers/controller/AuthenticationController.class OK
testing: WEB-INF/classes/com/es3/ers/config/SecurityConfig.class OK
Вы заметите, что AuthenticationController находится перед AuthenticationTokenProcessingFilter из Maven 3.0.5, а в 3.2.3 они противоположны.Из идей я извлек файлы из архива 3.0.5, удалил их и добавил обратно, чтобы они были в том же порядке:
$ unzip ers.war WEB-INF/classes/com/es3/ers/controller/AuthenticationController.class WEB-INF/classes/com/es3/ers/config/SecurityConfig.class
$ zip -d ers.war WEB-INF/classes/com/es3/ers/controller/AuthenticationController.class WEB-INF/classes/com/es3/ers/config/SecurityConfig.class
$ zip -ru ers.war WEB-INF/classes/com/es3/ers/controller/AuthenticationController.class WEB-INF/classes/com/es3/ers/config/SecurityConfig.class
$ unzip -t ers.war | grep -E "(AuthenticationController|AuthenticationTokenProcessingFilter|SecurityConfig)\.class"
testing: WEB-INF/classes/com/es3/ers/filter/AuthenticationTokenProcessingFilter.class OK
testing: WEB-INF/classes/com/es3/ers/controller/AuthenticationController.class OK
testing: WEB-INF/classes/com/es3/ers/config/SecurityConfig.class OK
После манипулирования файлами в архиве мы смоглидля успешного развертывания в WebLogic.Это исправление, очевидно, исправляет ошибку в нашем коде, но что здесь происходит?Я считал, что это связано с Maven, потому что он явно строит WAR в очень последовательном порядке для каждой версии, поэтому мне было интересно, что это изменилось.Maven 3.0.5 и 3.2.3 используют одну и ту же версию подключаемого модуля Maven WAR.