如何检查JEE8应用使用的JSON序列化提供程序(Payara4/5环境)
记录JEE8应用的JSON序列化提供程序及验证配置有效性
方法1:通过CDI注入Jsonb实例获取实现类
JEE8原生支持JSON-B API,直接注入Jsonb实例后,打印其实际实现类名称即可明确当前使用的JSON-B提供程序。
import javax.inject.Inject; import javax.json.bind.Jsonb; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class JsonProviderDetector implements ServletContextListener { @Inject private Jsonb jsonb; @Override public void contextInitialized(ServletContextEvent sce) { if (jsonb != null) { String providerName = jsonb.getClass().getName(); System.out.println("当前JSON-B序列化提供程序: " + providerName); // Payara 5默认输出org.eclipse.yasson.JsonbImpl,Payara 4默认输出org.eclipse.persistence.jaxb.jsonb.JsonbImpl // 若配置Jackson JSON-B实现,会输出com.fasterxml.jackson.module.jsonb.JsonbImpl } } }
部署后查看Payara服务器日志(路径为domain/logs/server.log),即可看到对应提供程序名称。
方法2:通过JAX-RS获取MessageBodyWriter实现类
如果应用用JAX-RS处理JSON,可获取MessageBodyWriter的实际实现类,判断使用的是Moxy、Jackson还是其他提供程序:
import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.ext.MessageBodyWriter; import java.util.Set; public class JsonProviderChecker { public static void detectProvider() { Client client = ClientBuilder.newClient(); Set<MessageBodyWriter<?>> writers = client.getConfiguration().getInstances(MessageBodyWriter.class); for (MessageBodyWriter<?> writer : writers) { String writerClass = writer.getClass().getName(); if (writerClass.contains("eclipse.persistence") || writerClass.contains("moxy")) { System.out.println("当前JAX-RS JSON序列化使用Moxy: " + writerClass); } else if (writerClass.contains("jackson")) { System.out.println("当前JAX-RS JSON序列化使用Jackson: " + writerClass); } else if (writerClass.contains("jsonb")) { System.out.println("当前JAX-RS JSON序列化使用JSON-B实现: " + writerClass); } } client.close(); } }
将这段代码放在启动类、Servlet或EJB中执行,输出结果会直接打印到日志。
方法3:结合配置文件验证自定义配置
Payara默认配置参考
- Payara 4默认用Moxy作为JAX-RS JSON提供程序,JSON-B默认实现为EclipseLink Moxy的适配版本
- Payara 5默认用Yasson(Eclipse官方JSON-B参考实现)作为JSON-B提供程序,JAX-RS仍支持Moxy或Jackson切换
验证配置生效
若你通过web.xml、beans.xml或Payara专属的glassfish-web.xml指定了JSON提供程序(比如强制用Jackson):
<!-- web.xml中配置JAX-RS使用Jackson --> <context-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider</param-value> </context-param>
可结合前面的代码方法,检查输出的实现类是否符合预期,以此确认配置生效。
方法4:通过Payara管理控制台查看
- 登录Payara管理控制台(默认端口4848)
- 进入Applications -> 选中你的应用 -> Details -> Classes and Resources
- 查看类加载器中的JSON相关类,比如
org.eclipse.yasson.JsonbImpl(Yasson)、com.fasterxml.jackson.databind.ObjectMapper(Jackson)、org.eclipse.persistence.jaxb.JAXBContext(Moxy),以此判断当前生效的提供程序。
内容的提问来源于stack exchange,提问作者MedMahmoud
相关产品推荐
相关产品推荐

