依赖更新后Java Spring MVC项目无法启动及Java Time类兼容问题
问题
在基于Maven的Java 8 Spring MVC项目中使用Java Time类(如Instant、LocalDate等)时遇到以下问题:
- 使用原有依赖(Hibernate 4.2.1.Final)时项目可启动,但查询包含LocalDate属性的模型类数据时抛出异常:
java.io.StreamCorruptedException: invalid stream header: 78790C08 - 升级Hibernate到5.2.1.Final(该版本支持Java Time)后,项目启动后仅显示空白页面,控制台无错误日志(使用IntelliJ IDEA运行)。已尝试升级Spring框架和Spring Security,但问题仍未解决。
项目POM的properties和dependencies部分如下:
<!-- Generic properties --> <java.version>1.8</java.version> <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding> <project.reporting.outputEncoding>ISO-8859-1</project.reporting.outputEncoding> <!-- Web --> <jsp.version>2.2</jsp.version> <jstl.version>1.2</jstl.version> <servlet.version>2.5</servlet.version> <!-- Spring --> <spring-framework.version>4.0.0.RELEASE</spring-framework.version> <spring-security.version>4.0.0.RELEASE</spring-security.version> <!-- Hibernate / JPA --> <hibernate.version>4.2.1.Final</hibernate.version> <!-- Apache Tiles --> <tiles.version>3.0.8</tiles.version> <!-- Logging --> <logback.version>1.0.13</logback.version> <slf4j.version>1.7.5</slf4j.version> <!-- Test --> <junit.version>4.11</junit.version> </properties> <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- Spring Security --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spring-security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${spring-security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>${spring-security.version}</version> </dependency> <!-- Spring and Transactions --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- Logging with SLF4J & LogBack --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> <scope>compile</scope> </dependency> <!-- Hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.2.0.Final</version> </dependency> <!-- Log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- iReport --> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.15.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-functions</artifactId> <version>6.15.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-fonts</artifactId> <version>4.0.0</version> </dependency> <!-- Apache Tiles --> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-jsp</artifactId> <version>${tiles.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-servlet</artifactId> <version>${tiles.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </exclusion> </exclusions> </dependency> <!-- Utility --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> <dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.4.0</version> </dependency> <!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.2.4</version> </dependency> <dependency> <groupId>org.directwebremoting</groupId> <artifactId>dwr</artifactId> <version>2.0.2</version> </dependency> <!-- Test Artifacts --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring-framework.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- Testing dependencies --> <!-- Other Web dependencies --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> <!-- makesure correct version here --> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>3.3.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>io.sentry</groupId> <artifactId>sentry-log4j</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>io.sentry</groupId> <artifactId>sentry</artifactId> <version>1.7.30</version> </dependency> </dependencies>
解决方案
一、修复Java Time与Hibernate的兼容问题
1. 调整核心依赖版本
Hibernate 5.2+要求搭配Spring 4.3.x及以上版本,原有Spring 4.0.0版本过低,直接引发兼容性冲突。调整版本如下:
spring-framework.version改为4.3.30.RELEASE(稳定兼容Hibernate 5.2的版本)spring-security.version改为4.2.20.RELEASE(与Spring 4.3.x版本匹配)hibernate.version改为5.2.18.Final(稳定支持Java Time的版本)hibernate-validator升级到5.4.3.Final(与Hibernate 5.2兼容)
2. 添加JPA API依赖
确保JPA版本适配Hibernate 5.2,添加以下依赖:
<dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.2</version> </dependency>
3. 配置模型类字段
在LocalDate类型字段上添加注解,确保数据库映射正确:
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import java.time.LocalDate; @Entity public class TargetModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(columnDefinition = "DATE") private LocalDate recordDate; // getter、setter方法 }
二、排查空白页面问题
1. 开启调试日志
修改Log4j配置,将日志级别设为DEBUG,捕获启动过程中的隐藏错误:
log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
2. 检查Spring MVC与视图配置
- 验证DispatcherServlet的URL映射规则,避免覆盖静态资源或页面请求路径
- 检查Apache Tiles的配置文件,确认视图解析器能正确加载tiles定义
- 核对控制器方法返回的视图名称,确保对应的JSP或tiles模板存在
3. 清理依赖冲突
执行Maven命令查看依赖树,定位冲突依赖:
mvn dependency:tree
重点检查Spring核心包、Hibernate核心包是否存在多版本共存,通过<exclusion>标签排除低版本冲突依赖。
4. 升级老旧依赖
项目中部分依赖版本过低,可能引发连锁问题:
- 将
dwr升级到3.0.2-RELEASE(兼容Java 8和Spring 4.3) - 替换
commons-lang为commons-lang3(版本3.12.0,原commons-lang已停止维护) - 将
jackson-core和jackson-databind升级到2.8.11.3(兼容Spring 4.3和Java Time序列化)
三、验证修复效果
- 执行
mvn clean install清理并重新构建项目 - 启动项目,查看控制台日志是否有错误输出
- 测试查询含LocalDate字段的模型类,确认
StreamCorruptedException不再出现 - 访问页面,验证页面内容是否正常显示
内容的提问来源于stack exchange,提问作者FrancescoDS
相关产品推荐
相关产品推荐

