1

spring MVC で jackson を使用してオブジェクトをシリアライズしたいと考えています。

プロパティ ObjectTest2 を持つ ObjectTest1 を返すコントローラーがあります。

public class ObjectTest1{
 private ObjectTest2;
 // setters getters...
}

public class ObjectTest2{
 private String value;
 // setters getters...
}

public @ResponseBody ObjectTest1 test() throws IOException ...

私にはマッパーがあり、ObjectTest2 のシリアライザーがあり、ObjectTest1.getObjectTest2 メソッドに @JsonSerialize(using = ObjectTest2.class) のアノテーションを付けました。

それは正しく動作します!しかし、ObjectTest1 だけでなく、多くのオブジェクトでこのシリアライザーを使用したいと考えています。

ゲッターメソッドごとに注釈を付けないようにするにはどうすればよいですか? ObjectTest2 であるすべてのプロパティに対して、このシリアライザーを自動的に使用できますか?

更新しました:

私はすでにコードでこれを使用しています:

<mvc:annotation-driven>

ajax 応答では、json として正しく生成されたオブジェクト。多分私は別の方法で説明しようとする必要があります。

そう。私はこれらのオブジェクトを持っています:

public class DTO{
  private InnerThing innerThing;

  @JsonSerialize(using=ThingSerializer.class)
  public InnerThing getThing(){...}
}

public class InnerThing{
  private String value;
}

生成された json は次のようになります。

{"innerThing":{"value":"something"}}

シリアライザーを作成した後、json は次のようになります。

{"innerThing":"something"}

問題ありませんが、json の 2 番目のバージョンを取得するには、DTO クラスの getInnerThing メソッドに @JsonSerialize という注釈を付ける必要があります...

InnerThing をプロパティとして使用するすべてのメソッドに注釈を付けたくありません。だから私の質問は、タイプが InnerThing であるすべてのプロパティを自動シリアル化することができますか?

4

2 に答える 2

3

デフォルトでは、Jackson をクラスパスに追加し、 または のいずれかを使用すると、Spring は JSON のシリアライズとデシリアライズを自動的に処理し<mvc:annotation-driven>ます@EnableWebMvc

Spring リファレンス ドキュメントへのリンク:

Spring 3.0: <mvc:annotation-driven>
Spring 3.1: <mvc:annotation-driven> および @EnableWebMvc

于 2012-09-17T18:44:12.703 に答える
2

Jackson が常にカスタム JsonSerializer または JsonDeserializer を使用して特定の型をシリアル化/逆シリアル化するようにしたいですか?

最終的に、Jackson が Spring Bean であるシリアライザーとデシリアライザーを見つけられるようにするカスタム Jackson モジュールを作成しました。Spring 3.1.2 と Jackson 2.0.6 を使用しています

簡易版:

public class MyObjectMapper extends ObjectMapper {
    @Autowired
    public MyObjectMapper(ApplicationContext applicationContext) {
        SpringComponentModule sm = new SpringComponentModule(applicationContext);
        registerModule(sm);
    }
}

モジュール:

public class SpringComponentModule extends Module {
    private ApplicationContext applicationContext;
    public SpringComponentModule(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
    @Override public String getModuleName() {
        return "jackson-spring-component";
    }
    @Override public Version version() {
        return SpringComponentModuleVersion.instance.version();
    }
    @Override
    public void setupModule(SetupContext context) {
        context.addSerializers(new SpringComponentSerializers(this.applicationContext));
        context.addDeserializers(new SpringComponentDeserializers(this.applicationContext));
    }
}

ComponentSerializer クラス:

public class SpringComponentSerializers extends Serializers.Base {
    private ApplicationContext applicationContext;
    public SpringComponentSerializers(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
    @Override
    public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) {
        Class<?> raw = type.getRawClass();
        Map<String,JsonSerializer> beanSet = applicationContext.getBeansOfType(JsonSerializer.class);
        for(String beanName : beanSet.keySet()) {
            JsonSerializer<?> serializer = beanSet.get(beanName);
            if(serializer.handledType().isAssignableFrom(raw)) {
                return serializer;
            }
        }
        return null;
    }
}
于 2012-09-20T22:42:21.550 に答える