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 と同じルート要素を持つ任意のランダム ドメイン オブジェクトを入力しようとするだけです (複数ある場合もあります)。
私たちの解決策: これは私たちの解決策ですが、これが最善ではないと確信しています。
親ドメイン オブジェクトを変更して、汎用ペイロードの XML 表現を String 形式で格納する String 変数を持たせる必要があります。このために、独自の 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