Spring Jackson在序列化期间排除特定属性

时间:2017-02-21 04:35:35

标签: spring serialization jackson

我有一个Spring Web服务,它让控制器返回Java Objects。我已将我的服务设置为使用@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE),以便响应在Json中。据我所知,Spring使用Jackson将Java对象序列化为Json。我有一个类,我想为其创建一个自定义的json序列化器。我想使用自定义序列化程序的唯一原因是避免将对象的特定属性序列化为API响应的一部分。

例如:

我的控制器方法返回Foo。 Spring将序列化所有属性作为API响应的一部分。但是,我想排除rawBar

public final class Foo{
  Bar propBar;
  Bar intermediateBar;
  Bar rawBar;
  FooBar status;
}

我见过使用StdSerializer<T>创建自定义序列化程序的示例。但是,这样做意味着我必须编写自定义代码来序列化其他属性。有没有办法排除特定的财产?此外,Foo是第三方库的一部分,因此无法对该类进行更改。是否可以为Foo创建自己的序列化程序,但是然后使用默认序列化程序来序列化除rawBar以外的所有属性?

2 个答案:

答案 0 :(得分:0)

其中一个解决方案是使用foo创建自己的类FooWrapper,将它们复制到fooWrapper并从控制器返回fooWrapper。

public class FooWrapper {
  Bar propBar;
  Bar intermediateBar;      
  FooBar status;
}

FooWrapper convertFooToFooWrapper(Foo foo) {
  FooWrapper fooWrapper = new FooWrapper ();
  BeanUtils.copyProperties(fooWrapper, foo);
  return fooWrapper ;
}

答案 1 :(得分:0)

正如@ user12190所提到的最简单的方法是:

public class Foo {

    Bar intermediateBar;
    Bar rawBar;
    FooBar status;
    Bar propBar;

    public Bar getPropBar() {
        return propBar;
    }

    public void setPropBar(Bar propBar) {
        this.propBar = propBar;
    }

    public Bar getIntermediateBar() {
        return intermediateBar;
    }

    public void setIntermediateBar(Bar intermediateBar) {
        this.intermediateBar = intermediateBar;
    }

    @JsonIgnore
    public Bar getRawBar() {
        return rawBar;
    }

    public void setRawBar(Bar rawBar) {
        this.rawBar = rawBar;
    }

    public FooBar getStatus() {
        return status;
    }

    public void setStatus(FooBar status) {
        this.status = status;
    }
}

你需要在你的pom中加入:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.6</version>
</dependency>