cxf-restはJSonProviderを構成してJSONの変換フォーマットをカスタマイズする

2305 ワード

CXF JSonProviderについて
CXFはJSonProviderでJSonをサポートし、デフォルトのProviderはjettsionで符号化または復号化されます.
CXFは、サービス側であれクライアントであれ、JSonProviderを構成することでJsonのフォーマットを構成できます.
例えばサーバ側
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
        <property name="dropRootElement" value="true"/>
        <property name="dropCollectionWrapperElement" value="true"/>
        <property name="serializeAsArray" value="true"/>
</bean>
       
<jaxrs:server id="customerService" address="/service1">
    <jaxrs:serviceBeans>
      <ref bean="customerBean" />
    </jaxrs:serviceBeans>
    <jaxrs:providers>
            <ref bean="jsonProvider"/>
    </jaxrs:providers>
  </jaxrs:server>

なお、JsonProviderのプロパティdropRootElementはfalseとしてデフォルト設定されており、Jsonフォーマットではクラス名が最初のノードとして使用されます.
{Customer:{"id":123,"name":"John"},trueに設定するとJson形式は{"id":123,"name":"John"},GsonなどのJsonパッケージは後者の形式を解析する.
一方、dropCollectionWrapperElementプロパティはfalseとデフォルト設定されており、Collectionに遭遇すると、Jsonはコレクション内でコンテナ内のクラス名をノードとして使用します.たとえば、{"Customer":{"id":123,"name":"John"}}であり、falseに設定すると、Json形式は{"id":123,name":"John"}}です.
一方,serializeAsArray属性はfalseがデフォルトであり,Collecionに遭遇した場合,{"id":123,"name":John"},trueに設定した場合,[{"id":123,"name":"john"},Gsonなどは後者として解析される.
CXF Client側についてもJSonProviderを設定し、springで直接符号化することもできます.
JSONProvider myJsonProvider = new JSONProvider();
                        myJsonProvider.setDropRootElement(true);
                        myJsonProvider.setSupportUnwrapped(true);
                        myJsonProvider.setSerializeAsArray(true);
                        List<JSONProvider> providers = new ArrayList<JSONProvider>();
                        providers.add(myJsonProvider);
                        WebClient client = WebClient.create("http://10.148.11.102:8080/testCXFServer",providers);