覆盖@JsonDeserialize和@JsonSerialize行为

时间:2016-07-04 07:02:16

标签: java json spring jackson

我有一个Spring(4.1.6)MVC项目,使用@JsonDeserialize注释的属性和Foo类中的@JsonSerialize工作正常。 Foo在RestController中使用,因此由Rest调用管理。

Foo包含在一个通用模块中,因此需要在其他模块中重用。

Something like:
-Web
--Common
-Services
--Common(Common is used in both)

我们将在Services模块中使用ObjectMapper进行转换。但是我们需要如何覆盖行为,以便在Services模块中忽略@JsonDeserialize和@JsonSerialize,并且我们按原样获取值。

我能想到的一个选择是创建新的bean扩展Foo并覆盖带注释的属性。

指向其他简单方法的指针吗?

1 个答案:

答案 0 :(得分:0)

我在杰克逊提供的Mixin中找到了解决方案。 我们可以使用mixin覆盖Annotations,如下所示,用于反序列化(序列化将类似):

步骤1.创建一个DummyDateDeSerializer,我们可以在其中编写用于日期解析的自定义逻辑。在我的情况下,我返回了收到的日期。

步骤2.创建一个Mixin类,定义应该覆盖其动画的属性。

public abstract class DateMixin {
  @JsonDeserialize(using=com.test.jackson.DummyDateDeSerializer.class)
  public abstract Date getLastModifiedDate() ;
  @JsonDeserialize(using=com.test.jackson.DummyDateDeSerializer.class)
  public abstract Date getCreatedDate() ;
}

步骤3.创建DummyDateModule

public class DummyDateModule extends SimpleModule {
  public DummyDateModule() {
      super("DummyDateModule", new Version(0, 0, 1, null));
  }

  @Override
  public void setupModule(SetupContext context) {
      context.setMixInAnnotations(Foo.class, DateMixin.class);
  }
}

步骤4.注册mdoule

  private static void updateMapper(ObjectMapper mapper){
      mapper.registerModule(new DummyDateModule());
  }

这将覆盖Foo或其超类中使用DummyDateDesrializer定义的任何@JsonDeserialize,用于属性createdDate和lastModifiedDate。