Spring Boot 2.4.5 REST服务WAR包部署Glassfish 5访问端点报错
问题根因
这个错误是Glassfish 5内置Jackson包和Spring Boot 2.4.5依赖的Jackson包版本冲突导致的:
- Spring Boot 2.4.5默认依赖Jackson 2.12.x版本,
ReferenceTypeSerializer类新增了带5个参数的withResolved方法,用于Optional等引用类型的序列化 - Glassfish 5内置了低版本的Jackson包,默认类加载策略优先加载服务器自带的Jar,低版本的
ReferenceTypeSerializer没有对应方法,调用时就会抛出AbstractMethodError - Tomcat 9默认优先加载Web应用
WEB-INF/lib下的依赖,所以使用Spring Boot自带的高版本Jackson运行正常
解决方案
方案1(推荐,从类加载层面彻底解决冲突)
在Web应用的src/main/webapp/WEB-INF目录下新建glassfish-web.xml配置文件,指定类加载优先使用应用自带的依赖:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app> <class-loader delegate="false"/> </glassfish-web-app>
重新打包部署即可。
方案2(临时规避,无需修改服务器配置)
修改Controller层代码,把返回值类型从Optional<Candidato>直接改为Candidato,绕开Jackson对Optional类型的序列化逻辑:
@RequestMapping("/candidatos/{chave}") public Candidato getCandidatoID(@PathVariable("chave") Integer chave) { return servicoRecrutamento.getCandidatoID(chave).get(); }
对应Service层代码不用修改,因为查询不到数据的时候已经抛出了异常,不会走到返回空Optional的逻辑。
内容的提问来源于stack exchange,提问作者Henrique C.
相关产品推荐
相关产品推荐

