2

次のように、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に変換され、同様にキーは を使用して短縮されます。aeAnnotationIntrospectorPropertyNamingStrategy

サーバ

@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_VALUEJson文字列でのみ機能すると思いますか??

cliemt からルート値をラップせず、json を次のように送信する場合、

{api=THA, aei=, rr=false}

ルート要素がなくても、リソースを POJO に正常に変換できます (を使用objectMapper.convertValue(resource, AE.class))。

しかし、ラッピング後は機能しません。これに対する提案はありますか??

4

0 に答える 0