我们在使用 Jersey 时遇到了通用有效负载的问题。这是我们的域对象。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Event<T> {
private T eventPayload;
private String eventType;
}
这里我们定义了顶级域对象。但是内部域对象是通用的。
现在在资源端点上我们有这样的东西,因为我们知道我们期望的子域对象是。
@POST
@Path("log")
@Consumes(MediaType.APPLICATION_XML)
public Response writeLog(Event<LogPayload> event)
但这不起作用。事件实例已创建,但子域未正确填充。它只是尝试使用与 XML 中具有相同根元素的任何随机域对象填充子域对象(可能有多个)。
我们的解决方案:这是我们的解决方案,但我确信这不是最好的。
我们必须修改我们的父域对象有一个字符串变量,它以字符串格式存储通用有效负载的 XML 表示。为此,我们必须编写自己的 Jaxb 编组器。对事件的修改
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Event<T> {
@XmlTransient
private T eventPayload;
private String eventType;
private String payLoadXML;
// Changes to the constructor:
public Event(T eventPayload ……) {
super();
this.eventPayload = eventPayload;
payLoadXML = JAXBUtils.marshall(eventPayload,false); }}
在资源方面,一旦我们获得父 Event 对象,我们必须再次使用我们自己的 jaxb marshaller 从 payloadXML 中获取所需的域对象,如下所示。
@POST
@Path("log")
@Consumes(MediaType.APPLICATION_XML)
public Response writeLog(Event<LogPayload> event)
LogPayload log1 = (LogPayload) JAXBUtils.unMarshall(
event.getPayLoadXML(),LogPayload.class);
所以实际上我们使用我们的 jaxbmarshaller 在进行其余调用之前和之后编组和解组通用子域对象……。
请让我们知道是否有更好的方法来做到这一点?
谢谢,ND