泽西Jaxb问题



我们在使用Jersey时遇到了通用有效载荷的问题。这是我们的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编组器。事件的修改

@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编组器从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

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

最新更新