3

デフォルトでJSON-Java変換にJacksonを使用するSpring MVC 3.1を使用しています。

次のカスタム変換を作成する必要があります。

  1. java.util.List (あらゆる種類の異なるタイプ用)。
  2. 列挙型から文字列へ
  3. java.util.Calendar

カスタム コンバーターを作成するためのいくつかの異なるアプローチに遭遇しました。

  1. ここで多かれ少なかれ説明されているように、カスタム ObjectMapper を作成します。

    public class CustomObjectMapper は ObjectMapper を拡張します...

次に、MappingJacksonHttpMessageConverter をサーブレット コンテキストに追加し、それをカスタム ObjectMapper に登録します。

次に、カスタム objectMapper にいくつかの特定の実装が必要だと思います (どのように見えるべきですか?)。

  1. 2 番目のアプローチでは、FormattingConversionServiceFactoryBean を拡張し、ここで説明するように独自のコンバーター (org.springframework.core.convert.converter.Converter を実装するクラス) を作成します。

更新 1: 私が見た別のアプローチは、ここで説明されているように、MappingJacksonHttpMessageConverter をサブカル化し、getJavaType メソッドをオーバーライドすることです。これを行うには、カスタム コンバーターをコンバーターのリストに追加する必要があります。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
    <list>
        <bean class="com.yl.app.CustomMappingJacksonHttpMessageConverter">
    </list>
</property>

どのアプローチが推奨されますか? これらは唯一のものですか、それを行うより良い方法はありますか?

更新 2:

まだわかりません。実際には、クラス A とクラス B があるとします。

クラス A は B のリストを保持します。

public class A {

   public List<B> list;

}

タイプ A のオブジェクトをクライアントに返したいと思います。@ResponseBody アノテーションを追加する以外に、サーバーで何をすべきですか (この場合、私が得る限り十分ではありません)。

4

2 に答える 2

6

どちらのアプローチも異なる目的を果たします。

あなたが概説した最初のアプローチは、Jackson ObjectMapper をカスタマイズすることです。たとえば、json で別の形式で日付を表示したり、カスタム シリアライザーを登録して、json へのクラスのマッピングを少し異なる方法で処理したりします。

2 番目のアプローチは、コンバーターを登録することです。たとえば、あるオブジェクトを別のオブジェクトに変換します。たとえば、String リクエスト パラメーターを UI からオブジェクトに変換したり、フィールドのエンティティ ID を取得してそれをエンティティに変換したい場合などです。 .

Jackson をカスタマイズするには最初のアプローチを使用し、カスタム コンバーターを作成するには 2 番目のアプローチを使用します。

更新: あなたが提供した新しい情報に基づいて、あなたが探しているのは実際にはコンバーターではなくHttpMessageConverterだと思います。

タイプ A のオブジェクトをクライアントに返したいと言うときは、ネットワークを介して何らかの方法でシリアル化します。通常は json または xml ですが、他の形式も可能性があります。それを json に変換する場合は、基本的にカスタマイズします。 ObjectMapper の基礎となる MappingJacksonHttpMessageConverter (Jackson 1.x を使用) または MappingJackson2HttpMessageConverter (Jackson2.x を使用) では、通常、次のようにします。

<mvc:annotation-driven conversion-service="conversionService"> 
   <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.bk.lmt.web.spring.CustomObjectMapper"/>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

カスタム オブジェクト マッパーで、Json 表現をカスタマイズする場合は、適切なシリアライザー/デシリアライザーを登録します。

XML の場合も同様に、通常、独自のコンバーター ( Jaxb2RootElementHttpMessageConverter ) を作成するのではなく、XmlJavaAdapters を使用して一部の要素をシリアル化する方法をカスタマイズします。

新しいシリアライゼーション形式 (xml、json 以外) がある場合は、はい、HttpMessageConverter をゼロから作成することができます。

于 2012-09-24T21:10:13.760 に答える
-2

自分で試した後、リストされているアプローチは必要ありません。Jackson (そのまま) は、ネストされたコレクションを問題なく処理でき、カスタマイズは不要です。

于 2012-09-29T19:54:49.650 に答える