Java EE RESTful 服务 JSON 编码 415 状态与 @Xml* 注释

标签 java json rest jpa jaxb

我有简单的 Java EE RESTful 服务,它在 Payara 4.1.1.154(GlassFish 4.1.1 分支 - http://payara.fish)上使用 JAX-RS (Jersey)、JPA (EclipseLink) 和 JAXB (EclipseLink MOXy)。

我使用两个实体 Radio 和 Stream,它们之间具有双向链接:

radio 实体:

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Radio {

    @Id
    @GeneratedValue
    private long id;

    @Column(unique = true, nullable = false)
    private String name;

    @Column(nullable = false)
    private String genre;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @XmlIDREF
    private List<Stream> streams;

    @Version
    private long version;
    ... constructors, getters, setters
}

流实体

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Stream {

    @Id
    @GeneratedValue
    @XmlID
    private long id;

    private String name;
    private String mountPoint;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn
    private Radio radio;

    @Version
    private long version;
    ... constructors, getters, setters
}

以及 RESTFul 资源处理程序:

@Path("/radios")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class RadioResource {

    @Inject
    private RadioService radioService;

    public RadioResource() {}

    @GET
    @Path("/{radioId}")
    public Radio getById(@PathParam("radioId") long id) throws com.roks.radio.rt.services.NotFoundException {
        return radioService.findById(id);
    }

    @POST
    public Response create(Radio radio, @Context UriInfo uriInfo) throws AlreadyExistsException {
        radioService.create(radio);
        return Response.created(
                uriInfo.getAbsolutePathBuilder().path(
                        String.valueOf(radio.getId())
                ).build()
        ).entity(radio).build();
    }
}

当使用 application/json 服务器响应类型执行 POST 请求时,状态代码为 415(不支持媒体类型)。当我从代码中删除 @XmlID 和 @XmlIDREF 注释时,除了 JSON 输出中缺少“streams”字段之外,一切正常(201 Created responce)。

我认为“流”不存在,因为当流列表为空时,结果 JSON 对象中存在循环引用。但我尝试使用 @XmlID 和 @XmlREFID 注释删除此引用,但 JSON 编码停止工作。

在 JSON 输出中,我主要需要带有流 ID 的“streams”字段。

我的代码有什么问题吗?

最佳答案

尝试使用注释

@JsonProperty

在您想要以 json 形式编码的 getter 上(org.codehaus.jackson.annotate.JsonProperty)。

您在项目中使用 jersey-media-moxy.jar 吗?其目的是将对象绑定(bind)到 JSON。我用过一次,但我不确定我是否还有来源。

关于Java EE RESTful 服务 JSON 编码 415 状态与 @Xml* 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34883483/

相关文章:

ios - Swift 3 JSON 解析异常

json - YII-在表单验证中添加错误代码

unit-testing - 用于单元测试 Jersey Restful Web 服务的最佳 API/lib?

java - 无法解析 AndroidManifest.xml 中的 XML

java - 在构造函数中做很多坏事吗?

java - 使用数组实现缓存 - ArrayIndexOutOfBoundsException (Java)

java - 在 JAX-RS Service jersey 实现中删除多个资源

java - 我在客户端上没有收到来自服务器的消息

java - 将 android 与 php mySQL 连接

java - Apache Shiro authc 使用 Java 和 apache HttpClient 进行基本身份验证