Jersey Jaxb问题

时间:2013-06-05 11:16:44

标签: rest generics jaxb jersey

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

1 个答案:

答案 0 :(得分:0)

我以前见过同样的问题,我认为这不会像你原先计划的那样有效。 Web服务(json / xml,rest / soap)通常会创建服务描述(如wsdl),而泛型类型在技术上不能成为此描述的一部分。你可以做的是发布事件不再通用的多个服务。