【问题标题】:Java EE RESTful service JSON marshalling 415 status with @Xml* annotations带有 @Xml* 注释的 Java EE RESTful 服务 JSON 编组 415 状态
【发布时间】:2016-01-19 17:40:28
【问题描述】:

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

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

无线电实体:

@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();
    }
}

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

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

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

我的代码有什么问题?

【问题讨论】:

  • 您查看过@XmlValue 流ID 注释吗?也许这就是你要找的东西

标签: java json rest jpa jaxb


【解决方案1】:

尝试使用注解

@JsonProperty

关于您希望在 json 中编组的 getter (org.codehaus.jackson.annotate.JsonProperty)。

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

【讨论】:

  • 我发现Jackson使用了\@JsonProperty注解,但是我使用EclipseLink MOXy,删除\@Xml注解时实体之间的循环链接怎么办?
  • 这是真的,我会根据您的需要编辑我的答案:
  • 你能把删除xml注释时得到的答案贴出来吗?
  • 没有 XmlID 和 XmlIDREF 注释我有 201 Created status with body: {"id":2,"name":"radio 2","genre":"rock,"version":1} . 当我添加此注释时,JSON 编组停止工作。
  • 同样的结果,当我做 POST 时,我有 415 状态。没有 XmlID 和 XmlIDREF,结果和我之前的回复一样。
猜你喜欢
  • 2015-04-29
  • 2018-12-06
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2011-11-15
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多