0

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

4

1 に答える 1