@JsonIgnore与@Getter Annotation

时间:2014-06-28 11:45:55

标签: java json jackson lombok

我可以在没有显式定义getter的情况下将@JsonIgnore与来自lombok的@Getter注释一起使用,因为我必须在序列化对象时使用此JsonIgnore,但在反序列化时,必须忽略JsonIgnore注释,因此我的对象中的字段不能是一个空。

@Getter
@Setter
public class User {

    private userName;

    @JsonIgnore
    private password;
}

我知道,只需在密码的getter上定义JsonIgnore,我可以阻止我的密码被序列化,但为此我必须明确定义我不想要的getter事物。 如有任何想法,任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:35)

要将@JsonIgnore放到生成的getter方法中,可以使用onMethod = @__(@JsonIgnore)。这将生成具有特定注释的getter。有关详细信息,请检查 http://projectlombok.org/features/GetterSetter.html

@Getter
@Setter
public class User {

    private userName;

    @Getter(onMethod = @__( @JsonIgnore ))
    @Setter
    private password;
}

答案 1 :(得分:2)

这可能非常明显,但我之前没有想过这个解决方案的时间很多:

@Getter
@Setter
public class User {

    private userName;

    @Setter
    private password;

    @JsonIgnore
    public getPassword() { return password; }
}

正如塞巴斯蒂安所说,@__( @JsonIgnore )可以解决这个问题,但有时使用onX Lombok功能(@__())可能会产生副作用,例如破坏javadoc的生成。

答案 2 :(得分:2)

最近我在使用杰克逊注释2.9.0和lombok 1.18.2时遇到了相同的问题

这对我有用:

@Getter
@Setter
public class User {

    @JsonIgnore
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

因此,基本上添加注释@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)意味着该属性只能用于反序列化(使用setter),而不能在序列化(使用getter)中读取

答案 3 :(得分:0)

对于JDK版本8,请在下面使用:

//  @Getter(onMethod=@__({@Id, @Column(name="unique-id")})) //JDK7
//  @Setter(onParam=@__(@Max(10000))) //JDK7
 @Getter(onMethod_={@Id, @Column(name="unique-id")}) //JDK8
 @Setter(onParam_=@Max(10000)) //JDK8

来源:https://projectlombok.org/features/experimental/onX

答案 4 :(得分:0)

我最近遇到了同样的问题。

有几种解决方法:

  1. 在项目的根文件夹中创建文件lombok.config,内容如下:
// says that it's primary config (lombok will not scan other folders then)
config.stopBubbling = true

// forces to copy @JsonIgnore annotation on generated constructors / getters / setters
lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonIgnore
...

在您的班级中,您可以照常在字段级别使用此注释:

@JsonIgnore
private String name;

注意:如果您使用lombok @RequiredArgsConstructor或@AllArgsConstructor,则应将@JsonIgnore@JsonIgnoreProperties的所有用法删除(如解决方案4中所述,或者仍可以选择解决方案2或3)。这是必需的,因为@JsonIgnore注释不适用于构造函数参数。

  1. 手动定义Getters / Setter方法,并在其上添加@JsonIgnore批注:
@JsonIgnore
public String getName() { return name; }

@JsonIgnore
public void setName(String name) { this.name = name; }
  1. 使用@JsonProperty(它是只读的或只写的,但不能两者都用):
@JsonProperty(access = JsonProperty.Access.READ_ONLY)  // will be ignored during serialization
private String name;

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)  // will be ignored during deserialization
private String name;
  1. 使用@JsonIgnoreProperties({ "fieldName1", "fieldName2", "..."})

当类还具有注解@AllArgsConstructor@RequiredArgsConstructor时,我个人将全局使用解决方案#1,将解决方案#4用作例外。