我们在使用Jersey时遇到通用Payload问题。这是我们的Domain对象。
@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中相同的根元素(可能有多个)。
我们的解决方案: 这是我们的解决方案,但我确信这不是最好的。
我们必须修改我们的父域对象有一个String变量,它以String格式存储通用有效负载的XML表示。为此我们必须编写自己的Jaxb marshaller。 对事件的修改
@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
答案 0 :(得分:0)
我以前见过同样的问题,我认为这不会像你原先计划的那样有效。 Web服务(json / xml,rest / soap)通常会创建服务描述(如wsdl),而泛型类型在技术上不能成为此描述的一部分。你可以做的是发布事件不再通用的多个服务。