spring3.x升级到sprin5.x问题记录
环境:jdk8、sprin3.0.6、ibatis、maven
org.springframework 3.0.6.RELEASE 升级至 5.2.19.RELEASE
org.springframework.security3.0.7.RELEASE 升级至 5.2.15.RELEASE
问题一:ibatis报错
错误信息:
ClassNotFoundException: org.springframework.orm.ibatis.SqlMapClientTemplate
错误原因:
spring升级到4.x后,orm包里面移除了对ibatis的支持
解决办法:添加mybatis-2-spring依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-2-spring</artifactId>
<version>1.0.1</version>
</dependency>
参考文档: link.
问题二:spring MappingJacksonJsonView没找到报错
错误信息:
nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.web.servlet.view.json.MappingJacksonJsonView] for bean with name 'org.springframework.web.servlet.view.json.MappingJacksonJsonView#1a8e5f95' defined in class path resource [springmvc-servlet.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.web.servlet.view.json.MappingJacksonJsonView
错误原因:
spring升级到4.x之后处理JSON的类不再是 MappingJacksonJsonView
解决办法:使用org.springframework.web.servlet.view.json.MappingJackson2JsonView代替
spring4.x以下版本处理“将ModelAndView里的数据变成JSON”的类
org.springframework.web.servlet.view.json.MappingJacksonJsonView
spring4.x以上版本处理“将ModelAndView里的数据变成JSON”的类
org.springframework.web.servlet.view.json.MappingJackson2JsonView
参考文档: link.
问题三:引用hibernate-validator错误
错误信息:
Caused by: java.lang.AbstractMethodError: org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;
错误原因 :
hibernate-validator 4.3.0.Final版本校验框架是JSR-303,而Hibernate validator 5.1.0.Final版本校验框架是JSR-349,spring-context-5.0.X.RELEASE.jar框架采用新的校验框架JSR-349。
<!-- 原maven依赖 -->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
</dependency>
<!-- 新maven依赖 -->
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
解决办法:
<!-- 备注:这里省下了一个依赖,hibernate-validator默认引用了validation-api,如下图) -->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</dependency>
针对非spring升级导致的错误,即本就是spring3.x报错,请参考这个文章:
参考文档: link、link.
问题四:jackson依赖错误
错误信息:
Could not load com/fasterxml/jackson/core/JsonGenerator
错误原因:
解决办法:修改jackson依赖
<!-- 原maven依赖 -->
<!--jackson start -->
<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-jaxrs -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.5.2</version>
</dependency>
<!--jackson end -->
<!-- 新maven依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
参考文档: link、link、Jackson fasterxml和codehaus的区别.
问题五:AnnotationMethodHandlerAdapter找不到
解决方案:
废弃的 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
最新使用 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
问题六:Hibernate Validator错误2
错误信息:
nested exception is java.lang.NoClassDefFoundError: org/hibernate/validator/resourceloading/ResourceBundleLocator
错误原因:
解决办法:
spring3.x配置
<!-- 开启支持@NumberFormat @DateTimeFormat @Valid标注 ,@DateTimeFormat用于bean 日期属性的格式化,请查看: http://static.springsource.org/spring/docs/3.0.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-config-->
<mvc:annotation-driven validator="validator"/>
<!-- 用于启用Hibernate Validator,并且使用spring MessageSource替换java ResourceBundle -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" >
<property name="messageInterpolator" ref="messageInterpolator"/>
</bean>
<bean id="messageInterpolator" class="org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator" >
<constructor-arg ref="resourceBundleLocator"></constructor-arg>
</bean>
<bean id="resourceBundleLocator" class="cn.org.rapid_framework.beanvalidation.MessageSourceResourceBundleLocator">
<property name="messageSource" ref="messageSource"/>
</bean>
spring5.x配置
<!-- 开启支持@NumberFormat @DateTimeFormat @Valid标注 ,@DateTimeFormat用于bean 日期属性的格式化,请查看: http://static.springsource.org/spring/docs/3.0.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-config-->
<mvc:annotation-driven validator="validator"/>
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class MyConfig {
@Bean("validator")
public Validator LocalValidator(){
return new LocalValidatorFactoryBean();
}
}