我們在使用Jersey時遇到了通用Payload的問題。這是我們的Domain對象。Jersey Jaxb問題
@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); }}
在資源方面,一旦我們得到父事件對象,我們必須再次使用我們自己的JAXB編組從payloadXML獲得所需的域對象,如下所示。
@POST
@Path("log")
@Consumes(MediaType.APPLICATION_XML)
public Response writeLog(Event<LogPayload> event)
LogPayload log1 = (LogPayload) JAXBUtils.unMarshall(
event.getPayLoadXML(),LogPayload.class);
所以ineffect我們運用jaxbmarshaller馬歇爾之前,使其餘的電話......之後解組通用的子域對象。
請讓我們知道是否有更好的方法來做到這一點?
感謝, ND
感謝您的回覆。好。我不認爲這是一個選項。有效載荷可以是任何物體的絕對。我們稍後可能會添加新的域對象。我們不可能有多種服務,以便Event不再是通用的。那麼我們的解決方案將起作用,因爲我們使用JAXB將subobejct作爲String-XMLabd發送,以將它解組回到所需的對象。唯一的問題是它看起來很亂,可能是資源密集型的。 – user2008203
你也可以使用一個超類(例如有效載荷),它有一個屬性映射並且可以序列化。你可以用這張地圖包裹每個有效載荷。當然這種方法有一些限制,它不是真正的面向對象的方式,但它應該起作用。我稍後會設置一個測試項目,因爲我也想找到一個體面的解決方案:) –
嗯..可能工作..但正如你所說的不是太面向對象。我們的方法再次具有相同的優點和缺點。我正在尋找更清潔的解決方案。很高興知道你是否找到一個。 :) – user2008203