You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:50:43