Payara5搭配RestEasy6.0.1默认用Yasson,如何强制切换为Jackson?
RestEasy序列化提供者选择逻辑及Payara 5下强制使用Jackson的方案
RestEasy 序列化提供者的选择逻辑
- RestEasy 3.x-5.x:基于Java EE 8及更早版本,默认优先识别并使用Jackson作为JSON序列化提供者——这是因为当时Jackson是生态中最主流的实现,且RestEasy默认依赖
resteasy-jackson2-provider,会自动注册Jackson的Provider。 - RestEasy 6.x:基于Jakarta EE 9+规范,该规范将**JSON-B(JSR-367)**设为默认的JSON绑定标准,Yasson是官方推荐的JSON-B实现。此时RestEasy的自动发现机制会优先检测容器中是否存在JSON-B实现(Payara 5自带Yasson),如果存在就会优先使用Yasson而非Jackson。
- 你之前配置的
jersey.config.jsonFeature是Jersey框架的专属参数,RestEasy并不识别该配置,所以不会生效——这就是添加配置后问题仍存在的核心原因。
Payara 5 + RestEasy 6.0.1 强制使用Jackson的步骤
确保引入正确的Jackson依赖
在项目的pom.xml(Maven)中明确添加RestEasy的Jackson提供者依赖,并排除可能冲突的JSON-B相关依赖:<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson2-provider</artifactId> <version>6.0.1</version> <exclusions> <exclusion> <groupId>jakarta.json.bind</groupId> <artifactId>jakarta.json.bind-api</artifactId> </exclusion> <exclusion> <groupId>org.eclipse</groupId> <artifactId>yasson</artifactId> </exclusion> </exclusions> </dependency>禁用RestEasy的JSON-B自动注册
在web.xml中添加RestEasy专属的上下文参数,关闭JSON-B的自动发现:<context-param> <param-name>resteasy.disable.jsonb</param-name> <param-value>true</param-value> </context-param>手动注册Jackson Provider
如果上述配置仍不生效,可在你的JAX-RS应用类中手动注册Jackson的Provider:import org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider; import jakarta.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; public class YourRestApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); // 注册Jackson序列化提供者 classes.add(ResteasyJackson2Provider.class); // 添加你的业务资源类 classes.add(YourApiResource.class); return classes; } }调整Payara类加载顺序(可选)
如果Payara容器自带的Yasson仍存在干扰,可在WEB-INF/glassfish-web.xml中配置类加载优先级,让项目自带的Jackson优先加载:<glassfish-web-app> <class-loader delegate="false"/> </glassfish-web-app>注意:将
delegate设为false会让项目优先加载自身依赖,可能引发其他容器依赖的兼容性问题,需测试验证后再使用。
内容的提问来源于stack exchange,提问作者chrisl08
相关产品推荐
相关产品推荐

