如何在Payara 5中使用Jackson 2?兼容JAX-RS且无需修改注解
刚好我之前从Payara 4迁移到Payara 5时也遇到了同样的需求——不想改动现有JAX-RS注解,只想替换掉默认的Yasson,继续用Jackson处理JSON序列化/反序列化。给你几个经过验证的可行方案:
方案1:全局域级配置(影响所有部署的应用)
如果希望整个Payara 5域都默认使用Jackson作为JAX-RS JSON提供器,可以修改域配置文件:
- 找到Payara安装目录下的
glassfish/domains/[你的域名]/config/domain.xml - 在
<jvm-options>节点中添加以下参数:-Dfish.payara.jaxrs.json.provider=jackson - 重启Payara服务器后,这个配置会自动禁用Yasson的JAX-RS绑定,转而使用Jackson。
方案2:项目级配置(仅针对当前应用)
如果只想让单个应用切换到Jackson,不需要修改服务器全局配置,可以在项目的部署描述文件中添加上下文参数:
- 若使用
web.xml,添加:<context-param> <param-name>fish.payara.jaxrs.json.provider</param-name> <param-value>jackson</param-value> </context-param> - 若使用Payara专属的
glassfish-web.xml,同样添加上述参数即可。
这样部署应用后,该应用会自动使用Jackson,其他应用不受影响。
方案3:通过JAX-RS Application类手动注册
如果你的项目有自定义的JAX-RS Application子类,也可以通过代码方式显式注册Jackson提供器,同时隐式排除Yasson:
- 确保项目中引入了Jackson的JAX-RS依赖(如果Payara未自带,需手动添加):
<!-- Maven依赖示例 --> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.15.2</version> <!-- 选择与Payara兼容的版本 --> <scope>provided</scope> <!-- 若Payara已包含该依赖则使用provided --> </dependency> - 在自定义
Application类中注册Jackson提供器:import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; public class MyJaxRsApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); // 注册Jackson的JSON提供器 classes.add(JacksonJsonProvider.class); // 添加你的其他JAX-RS资源类 classes.add(MyResource.class); return classes; } }
这种方式灵活性最高,适合需要对JAX-RS组件做精确控制的场景。
补充说明
- 关于Jackson版本:建议选择与Payara 5内置版本兼容的Jackson版本,避免依赖冲突。Payara 5通常内置了Jackson 2.x系列的稳定版本,使用
providedscope可以避免重复打包。 - 若遇到Yasson仍被加载的情况,可以检查是否有其他第三方库依赖了Yasson,或者在
domain.xml中额外添加-Dorg.glassfish.jersey.jsonp.disable=true参数强制禁用JSON-P相关的默认提供器。
内容的提问来源于stack exchange,提问作者Whyvra FVR
相关产品推荐
相关产品推荐

