我使用來自第三方的界面,他們有一個特殊的(在我看來至少)的請求/響應,並通知XML格式。該XML需要看起來像這樣:JAXB:在抽象類將XML標籤
<Message>
<Version>3.1</Version>
<Request>
<Request_Name>
<RequestID> Request ID </RequestID>
...
</Request_Name>
</Request>
</Message>
的Request
標籤也可能是Notification
或Response
之一。所有Messages
將只有這三個中的一個。 Request
和Response
都有RequestID
。 Response
也有ReturnValue
。 Notification
s有Session
。
爲了防止重複我想創造一個抽象類這三種類型的,它幾乎作品!我可以編組和解組從這個樣子的:
<Message>
<Version>3.1</Version>
<Request_Name>
<RequestID> Request ID </RequestID>
...
</Request_Name>
</Message>
注意失蹤Request
標籤! Notification
和Response
相同。所有信息都在那裏,但這些包裝標籤正在殺死我!
問題: 我可以把XML標籤上的抽象類?或者,我是否需要使其成爲非抽象的,並創建另一個頂級抽象類作爲「真正的」抽象基類?
我有JAXB沒有太多的經驗,所以我希望有一個簡單的方法來做到這一點。我試圖使報文中的request
領域的XMLElement
代替,但只有改變Request_Name
標籤Request
並增加了一個類型規範。
我的代碼基本上如下,以取出來簡潔制定者和構建函數。
基部Message
類:
@XmlRootElement(name = "Message")
public class Message {
@XmlElement(required = true, name = "Version") private String version;
private Request request;
private Response response;
private Notification notification;
@XmlElementRef(required = false)
public Request getRequest() {
return request;
}
@XmlElementRef(required = false)
public Response getResponse() {
return response;
}
@XmlElementRef(required = false)
public Notification getNotification() {
return notification;
}
}
摘要Request
類。
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public abstract class Request {
private String requestId;
@XmlElement(name = "RequestID", required = true)
public String getRequestId() {
return requestId;
}
}
一個例子Request
實現:
@XmlRootElement(name = "RegForAllNotificationsRequest")
public class RegForAllNotificationsRequest extends Request {
private long session;
private boolean register;
@XmlElement(name = "SessionToUse")
public long getSession() {
return session;
}
@XmlElement(name = "Register")
public boolean isRegister() {
return register;
}
}
上述被編組是這樣的:爲Notification
和Response
類似
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message>
<Version>8.3</Version>
<RegForAllNotificationsRequest>
<RequestID>94668</RequestID>
<SessionToUse>548248</SessionToUse>
<Register>true</Register>
</RegForAllNotificationsRequest>
</Message>
,我需要這樣的:
<?xml version="1.0" encoding="UTF-8"?>
<Message>
<Version>8.3</Version>
<Request>
<RegForAllNotificationsRequest>
<RequestID>94668</RequestID>
<SessionToUse>548248</SessionToUse>
<Register>true</Register>
</RegForAllNotificationsRequest>
</Request>
</Message>
這實際上非常接近我結束了。我會發布我的解決方案,但會標記你的正確。 – Dennis 2014-12-03 11:25:35