Статьи

Обновление до весны 3.2

Несколько дней назад я подумал, что пришло время обновить мой пример кода до Spring 3.2, после всего того, что он существовал довольно много времени и даже выпустил исправление ошибки.

Обновление до Spring 3.2 — это очень простой вопрос обновления номера версии Maven и перестройки, что-то вроде этого:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.2.1.RELEASE</version>
</dependency>

… для каждой зависимости Spring, а затем перекомпилировать
и это как раз об этом … за исключением того, на этот раз есть несколько
ошибок .

Обновление проектов MVC

Первое, что вы можете обнаружить, это то, что несколько обычных аннотаций MVC, включая @RequestMapping, перестают компилироваться, и вы получите что-то подобное в STS / eclipse:

… что кажется странным. Исправление заключается в добавлении spring-web в зависимости вашего файла pom.xml:

<!-- Add this as Spring 3.2.1-RELEASE update -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

… вероятно где-то рядом:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

Вы можете спросить, почему это происходит, и у меня есть теория. Это всего лишь предположение, но кажется логичным, что в предыдущих версиях Spring была временная зависимость между spring-webmvc и spring-web, которой больше не существует, и поэтому вам необходимо специально добавить свою собственную зависимость spring-web.

Теперь это просто общая ошибка; однако в двух проектах Github, посвященных отладке капитана:
tomcat-ssl и
социальная STS / eclipse обнаружили проблему в XML-файле контекста Spring. Линия была:

 <annotation-driven/>

Ошибка была:

Error occured processing '/social/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml'

… и ассоциированное исключение было:

java.lang.NoClassDefFoundError: org/springframework/web/accept/ContentNegotiationManagerFactoryBean
 at org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.getContentNegotiationManager(AnnotationDrivenBeanDefinitionParser.java:293)
 at org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.parse(AnnotationDrivenBeanDefinitionParser.java:151)
 at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
 at org.springframework.ide.eclipse.beans.core.internal.model.namespaces.DelegatingNamespaceHandlerResolver$ElementTrackingNamespaceHandler.parse(DelegatingNamespaceHandlerResolver.java:177)
 at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1419)
 at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$ErrorSuppressingBeanDefinitionParserDelegate.parseCustomEleme
etc…

Как и проблема @RequestMapping, описанная выше, эта проблема заключалась в неправильных переходных зависимостях. В случае проекта tomcat-ssl проблема была вызвана вытягиванием web-безопасности Spring в Spring-Web версии 3.1.0-RELEASE, а не 3.2.1-RELEASE. Аналогичным образом, в социальном проекте проблема была вызвана использованием Spring-social-twitter в Spring-web версии 3.0.7, а не в 3.2.1-RELEASE

. Исправление, опять же, заключается в добавлении Spring-web в качестве зависимости в вашем проекте.

<!-- Add this as Spring 3.2.1-RELEASE update -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

Проблемы с EhCache

После того, как все веб-проекты снова заработали, следующая проблема возникла в примере кода ehcache. Этот проект также прекратил компиляцию, и это потому, что класс org.springframework.cache.ehcache.EhCacheCacheManager не найден. Причину этого можно найти в документации Spring. Ребята из Spring перевели поддержку EhCache в виде пакета org.springframework.cache.ehcache из модуля spring-context в поддержку spring-context-support. Причина этого кажется разумной, потому что EhCache не является передовым Spring-пакетом, это вспомогательный пакет и, следовательно, входит в spring-context-support для уменьшения раздувания модулей наряду с jcache, mail, кварцевым планированием и commonj, в то время как на фронте пользовательского интерфейса он содержит бесплатный маркер, отчеты о яшме и поддержку скорости.

Чтобы решить эту проблему, добавьте в файл pom.xml следующее:

<dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context-support</artifactId>
       <version>${spring.version}</version>
</dependency> 

Неправильная версия Java

В нескольких проектах я получил следующую ошибку при запуске mvn clean install в среде STS / eclipse:

org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.UnsupportedClassVersionError: caching/EhCachePersonDAOTest : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)

Причина этого в том, что в процессе сборки использовалась Java 6, а не Java 7. Помните, что это старые, существующие проекты, изначально созданные с использованием Java 6, а затем обновленные по мере необходимости. Решение этой проблемы — вручную изменить версию среды выполнения Java на Java 7 в свойствах проекта, как показано на рисунке ниже:

CGLib больше не требуется

Это не очевидная проблема, но ребята из Spring убрали необходимость специально включать CGLib в ваш проект. CGLib требуется, если вы используете аннотацию @Configuration. Версия 2.2 обычно добавляется в ваш pom.xml, когда вы создаете новый проект с использованием параметра
Spring Template Project на панели инструментов STS, как показано ниже:

<!-- CGLIB, only required and used for @Configuration usage: could be removed in future release of Spring -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib-nodep</artifactId>
    <version>2.2</version>
</dependency>

Как говорят ребята из Spring в своей документации:

в предыдущих версиях пользователи прокси-серверов AOP на основе подклассов Spring (например, через proxy-target-class = «true») и поддержка класса @Configuration были обязаны объявить явную зависимость от CGLIB 2.2 , Начиная с Spring Framework 3.2, мы теперь переупаковываем и подключаем недавно выпущенный CGLIB 3.0. Это означает большее удобство для пользователей, а также правильную функциональность для пользователей Java 7, которые создают прокси подклассов типов, которые содержат инструкции invokedynamicbytecode. Внутренняя переупаковка CGLIB гарантирует отсутствие конфликтов пути к классам с другими сторонними средами, которые могут зависеть от других версий CGLIB.

Обновление схем проекта

Это необязательно, но вы также можете изменить заголовки Spring XML с 3.1 на 3.2, чтобы указанная ссылка на XML-схему заканчивалась на -3.2.xsd. Например:

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

становится

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

Самый простой способ сделать это — использовать глобальную замену eclipse для замены -3.1.xsd на -3.2.xsd, но сначала сделайте быструю проверку, прежде чем делать это …

Это изменение действительно необходимо, только если вы хотите использовать любые новые функции, которые определены в файлах XML-схемы 3.2. Я внес изменения только для того, чтобы выяснить, были ли проблемы с обратной совместимостью, и не было, все было хорошо.

И это все. Если вам нужно узнать об обновлении до Spring 3.1, взгляните на
этот старый блог, и если вы все еще используете Spring 2.x и хотите обновить его до 3, то посмотрите
этот еще более старый блог .


С момента написания этого блога ребята из Spring выпустили новую версию Spring: 3.2.2-RELEASE