次のように、JSON 形式のコンテンツ本文を含む HTTP 要求をサーバーに送信します。
クライアント
String json = null;
objectMapper = new ObjectMapper();
objectMapper.SerializationConfig(Feature.WRAP_ROOT_VALUE. true);
objectMapper.setPropertyNamingStrategy(new LongNameShortNameNamingStrategy());
objectMapper.setAnnotationIntrospector(new SerializingAnnotionIntrospector());
json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);;
System.out.println("CONVERTED JSON CONTENT" + json);
HttpEntity entity = new ByteArrayEntity(json.getBytes("UTF-8"));
( (HttpPut) httpUriRequest).setEntity(entity);
System.out.println("ENTITY" + entity);
これにより、コンテンツが JSON に変換され、ルート要素も追加されます。命名戦略を使用してプロパティ名をフォームAnnottaionIntrospector
に変換し、同様に rootName を同じフォームに変換します。
{
"ae" : {
"api" : "THA",
"aei" : "",
"rr" : false
}
Annotation のルート要素はinsideAE
に変換され、同様にキーは を使用して短縮されます。ae
AnnotationIntrospector
PropertyNamingStrategy
サーバ
@PUT
@Consumes({"application/json"})
@Produces({"application/json"})
public void handlePutRequest(Object resource) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDeserializationConfig.Feature.UNWRAP_ROOT_VALUE);
objectMapper.setPropertyNamingStrategy(new LongNameShortNameNamingStrategy());
objectMapper.setAnnotationIntrospector(new DeserializingAnnotionIntrospector());
objectMapper.convertValue(resource, AE.class);
サーバーで受信するリソースはLinkedHasMap
、クライアントから送信された JSON です。
CONTENT: {ae={api=THA, aei=, rr=false}}
ご覧のとおり、変更されたルート名が存在します。
ただし、 POJO に正しくobjectMapper.convertValue(resource, AE.class);
変換されずAE
、エラーが発生します。
resteasy-servlet threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalArgumentException: Root name 'ae' does not match expected ('AE') for type [simple type, class cdot.onem2m.resource.xsd.AE]
at [Source: N/A; line: -1, column: -1]
at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:340) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:214) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:190) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:540) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:502) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.2.Final.jar:]
を適用UNWRAP_ROOT_VALUE
しましたが、それでもエラーが発生します。UNWRAP_ROOT_VALUE
Json文字列でのみ機能すると思いますか??
cliemt からルート値をラップせず、json を次のように送信する場合、
{api=THA, aei=, rr=false}
ルート要素がなくても、リソースを POJO に正常に変換できます (を使用objectMapper.convertValue(resource, AE.class)
)。
しかし、ラッピング後は機能しません。これに対する提案はありますか??