【问题标题】:Overriding @JsonDeserialize and @JsonSerialize Behaviour覆盖 @JsonDeserialize 和 @JsonSerialize 行为
【发布时间】:2016-07-04 07:02:16
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java json spring jackson


    【解决方案1】:

    我在杰克逊提供的 Mixin 中得到了一个解决方案。 我们可以使用 mixin 覆盖注释,如下所示进行反序列化(序列化类似):

    第 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());
      }
    

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

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多