1

RestEasy と Jettison プロバイダーが有効になっている JBoss AS 7.1 で動作するように、ルート要素を使用して JSON シリアル化を作成する方法を必死に探しています。

RestEasy のドキュメントによると、JSON ルート要素を返すことは機能するはずですが、REST サーブレットを要求するときに取得することはありません。

オブジェクト ファクトリを使用します。

@XmlRegistry
public class ObjectFactory {

    private final static QName _NotificationList_QNAME = new QName("xxx:xxx:xxx", "notificationList");

   public NotificationList createNotificationList() {
        return new NotificationList();
    }

    @XmlElementDecl(namespace = "xxx:xxx:xxx", name = "notificationList")
    public JAXBElement<NotificationList> createNotificationList(NotificationList value) {
        return new JAXBElement<NotificationList>(_NotificationList_QNAME, NotificationList.class, null, value);
    }

}

次の XML オブジェクトを使用します。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "NotificationList", namespace = "xxx:xxx:xxx:xxx", propOrder = {
    "any"
})
@XmlRootElement (name = "notificationList" )
public class NotificationList {

    @XmlAnyElement(lax = true)
    protected List<Object> any;


    @XmlElement (name="notificationList")
    public List<Object> getAny() {
        if (any == null) {
            any = new ArrayList<Object>();
        }
        return this.any;
    }
}

ルート要素「notificationList」で通知リストが返されることを期待していますが、取得できません。デフォルトで Jettison プロバイダーを使用していますが、Jackson にも切り替えました。どちらも私にはうまくいきません。

言及する価値があるかもしれませんが、REST メソッドはオブジェクト自体を返すのではなく、AsynchronousResponse を別のオブジェクトに渡します。別のオブジェクトは処理し、最終的に JSON オブジェクトを返します。応答を作成するときに AsynchronousResponse を使用します。

編集: 実際に NotificationList を使用しているクラスに関する詳細情報:

次の REST クラスは、NotificationChannel クラス (ここでは重要ではありません) を使用し、非同期応答オブジェクトを別のクラスに渡します。この応答オブジェクトは、最終的に NotificationList を返します。簡単に説明すると、次のようになります。

     @Path("/notificationchannel/v1")
            public class NotificationChannelService {

        @POST
        @Path("/{userid}/channels")
        @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
        @Mapped(namespaceMap = {
           @XmlNsMap(namespace = "XXXX:XXXX:XXXX:XXXX", jsonName = "notificationChannel")
               })

        public void createNotificationChannel(
            final @Suspend(10000) AsynchronousResponse response,
            final JAXBElement<NotificationChannel> ncParam, 
            @PathParam("userid") String userID) {


            NotificationManager nMan = new NotificationManager(resp);

        }
 }

レスポンスは次のように作成されて返されます。

   public class NotificationManager {

      public NotificationManater(AsynchronousResponse resp){

      //dostuff


      notificationList = objectFatory.creatNotificationList();

      //add notification object (also defined int ObjectFactory)
       notificaitonList.addObject(messageNotification)
       notificaitonList.addObject(statusNotification)
       notificaitonList.addObject(inviteNotification)

       //dostuff


       resp.setResponse(Response.created(UriBuilder.fromUri(nc.getResourceURL()).build())
                        .entity(notificationList)
                        .type(MediaType.APPLICATION_JSON)


                    .build());
        }
     }

クライアント側では、次の応答が期待されます。

{"notificationList": {
    "inboundMessageNotification": {"inboundMessage": {
        "destinationAddress": "tel:+19585550100",
        "inboundMMSMessage": {"subject": "Who is RESTing on the beach?"},
        "link": {
            "href": "http://example.com/exampleAPI/v1/messaging/inbound/subscriptions/sub123",
            "rel": "Subscription"
        },
        "messageId": "msg123",
        "resourceURL": "http://example.com/exampleAPI/v1/messaging/inbound/registrations/reg123/messages/msg123      ",
        "senderAddress": "tel:+19585550101"
    }},
    "presenceNotification": {
        "callbackData": "1234",
        "link": {
            "href": "http://example.com/exampleAPI/v1/presence/tel%3A%2B19585550101/subscriptions/presenceSubscriptions/        tel%3A%2B19585550100/sub001",
            "rel": "PresenceSubscription"
        },
        "presence": {"person": {"mood": {"moodValue": "Happy"}}},
        "presentityUserId": "tel:+19585550100",
        "resourceStatus": "Active"
    }
}} 

しかし、私はこれを取得します(RootElement名も通知オブジェクト名もありません):

{
    {
        "destinationAddress": "tel:+19585550100",
        "inboundMMSMessage": {"subject": "Who is RESTing on the beach?"},
        "link": {
            "href": "http://example.com/exampleAPI/v1/messaging/inbound/subscriptions/sub123",
            "rel": "Subscription"
        },
        "messageId": "msg123",
        "resourceURL": "http://example.com/exampleAPI/v1/messaging/inbound/registrations/reg123/messages/msg123      ",
        "senderAddress": "tel:+19585550101"
    },
    {
        "callbackData": "1234",
        "link": {
            "href": "http://example.com/exampleAPI/v1/presence/tel%3A%2B19585550101/subscriptions/presenceSubscriptions/        tel%3A%2B19585550100/sub001",
            "rel": "PresenceSubscription"
        },
        "presence": {"person": {"mood": {"moodValue": "Happy"}}},
        "presentityUserId": "tel:+19585550100",
        "resourceStatus": "Active"
    }
} 
4

1 に答える 1

1

私はまったく同じ問題に直面しました。問題は、Jackson (resteasy-jackson-provider) に基づく json プロバイダーが実際にシリアライゼーションを引き継いでいることです (暗黙のモジュール依存関係のため)。私がしたことは、特定のデプロイメント記述子META-INF/jboss-deployment-structure.xmlを次の内容で使用することでした。

 <jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.jboss.resteasy.resteasy-jackson-provider" />
    </exclusions>
    <dependencies>
      <module name="org.jboss.resteasy.resteasy-jettison-provider" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

これにより、コンテナーはアプリケーションのジェッティソン プロバイダーに強制的に切り替えられます。

于 2013-12-05T18:50:45.820 に答える