Jackson 忽略类序列化中的 getter

Pep*_*mez 8 serialization spring dto jackson

我正在尝试序列化一个我无法触及任何内容的类。问题是我想忽略一些getWhatever() getter 方法,但我无法使用@JsonIgnore标记 getter 方法,因为这意味着触及 DTO 类。

该序列化是通过 Spring REST Web 服务中的@RestController方法进行的,因此如果它能成为考虑到这一点的解决方案,那就太好了。

我想到了一个我不喜欢的解决方案...它将为我想要序列化的 DTO 类创建一个自定义序列化器,这样我就可以控制什么被序列化,什么不被序列化,然后,从@RestController,不是返回 DTO 类(我认为这是更优雅的),而是在使用ObjectMapper获取 JSON 字符串并强制自定义序列化程序后返回String 。

我不喜欢这个解决方案,因为:

  • 我必须为每个需要序列化的 DTO 类创建一个自定义序列化器,其中包含我不想序列化的 getter 方法
  • 我不喜欢返回表示 JSON 的字符串(代表 DTO)的解决方案...我更喜欢透明地执行此操作,并从方法返回 DTO 类,并让 Spring 自动化生成该转换

预先感谢您...任何帮助将不胜感激

编辑(解决方案) 由于@Cassio Mazzochi Molin 的想法,我终于采用了这个解决方案:

interface FooMixIn {
    @JsonIgnore
    Object getFoo();
    @JsonIgnore
    Object getBar();
}

@Service
public class ServiceFooSerializer extends SimpleModule{
    public ServiceFooSerializer(){
        this.setMixInAnnotation(Foo.class, FooMixIn.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

cas*_*lin 4

当无法修改类时,您可以使用混合注释

您可以将其视为一种面向方面的方式,在运行时添加更多注释,以增强静态定义的注释。

首先定义一个混合注释接口(类也可以):

public interface FooMixIn {

    @JsonIgnore
    Object getWhatever();
}
Run Code Online (Sandbox Code Playgroud)

然后配置ObjectMapper为使用定义的接口作为 POJO 的混合:

ObjectMapper mapper = new ObjectMapper().addMixIn(Foo.class, FooMixIn.class); 
Run Code Online (Sandbox Code Playgroud)

一些使用注意事项:

  • Jackson 识别的所有注释集都可以混合。
  • 各种注解(成员方法、静态方法、字段、构造函数注解)都可以混入。
  • 仅方法(和字段)名称和签名用于匹配注释:访问定义(privateprotected、...)和方法实现将被忽略。

有关更多详细信息,请查看 Jackson文档