【发布时间】: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 注释吗?也许这就是你要找的东西