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"
}
}