JAX-RS POJO转JSON在Payara 5中无法正常工作
解决JAX-RS中POJO无法转换为JSON的问题
这个问题在JAX-RS开发里挺常见的——你的服务能正常返回XML,但JSON格式就报错,核心原因是JAX-RS默认只自带JAXB(XML绑定)的支持,而JSON序列化需要额外的提供商和配置。下面给你一步步搞定的方案:
第一步:让资源方法明确支持JSON格式
先给你的RecipesResource里的getRecipe方法加上@Produces注解,同时声明XML和JSON两种媒体类型,这样服务就知道要处理这两种请求格式了:
@Path("recipes") @Stateless public class RecipesResource { @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) // 新增这行 public Recipe getRecipe() { return new Recipe("cake", 120); } }
第二步:添加JSON序列化依赖
接下来需要引入JSON序列化的库,最常用的有两种选择,挑一种就行:
选项1:使用Jackson(推荐,生态最成熟)
如果用Maven管理依赖,在pom.xml里添加Jackson的JAX-RS提供商依赖:
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.15.2</version> <!-- 建议用最新稳定版 --> </dependency>
Jackson能自动识别你已经加的JAXB注解(比如@XmlRootElement),不需要额外修改Recipe实体类。
选项2:使用MOXy(EclipseLink出品,部分容器默认支持)
如果你用的是GlassFish这类默认集成MOXy的容器,只需要添加MOXy的依赖(如果容器没自带的话):
<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>4.0.2</version> </dependency>
MOXy同样兼容JAXB注解,你的Recipe实体类完全不用改。
第三步:注册JSON提供商(可选,部分容器自动注册)
像Tomcat这类容器不会自动注册JSON提供商,这时候需要手动在JAX-RS应用类里注册:
注册Jackson提供商
创建一个继承Application的类,把你的资源类和Jackson提供商一起注册:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; @ApplicationPath("/api") // 你的API根路径 public class JaxRsApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); classes.add(RecipesResource.class); classes.add(JacksonJsonProvider.class); // 注册Jackson return classes; } }
注册MOXy提供商
如果选MOXy,就注册MoxyJsonProvider:
import org.eclipse.persistence.jaxrs.MoxyJsonProvider; // 在getClasses方法中添加 classes.add(MoxyJsonProvider.class);
验证效果
现在发送一个Accept头为application/json的GET请求到/recipes,就能得到如下JSON响应了:
{"title":"cake","preparationTime":120}
内容的提问来源于stack exchange,提问作者yeahservice
相关产品推荐
相关产品推荐

