0

我们在使用 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

4

1 回答 1

0

我以前见过同样的问题,我认为这不会像你最初计划的那样工作。Web 服务(json/xml、rest/soap)通常会创建服务描述(如 wsdl),而泛型类型在技术上不能成为该描述的一部分。您可以做的是发布多个服务,其中 Event 不再是通用的。

于 2013-06-05T11:29:56.553 回答