使用@ Xml *注释的Java EE RESTful服务JSON编组415状态

时间:2016-01-19 17:40:29

标签: java json rest jpa jaxb

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

我使用两个实体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
}

Streams entity

@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状态代码进行响应(不支持mediatype)。当我从代码中删除@XmlID和@XmlIDREF注释时,所有工作正常(201 Created responce),但JSON输出中缺少“streams”字段除外。

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

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

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

尝试使用注释

@JsonProperty

在你想要在json(org.codehaus.jackson.annotate.JsonProperty)中编组的getter上。

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