29

我可以在不显式定义getter的情况下使用来自lombok的@JsonIgnore和@Getter注释,因为我必须在序列化对象时使用这个JsonIgnore,但在反序列化时,必须忽略JsonIgnore注释,所以我的对象中的字段不能为空?

@Getter
@Setter
public class User {

    private userName;

    @JsonIgnore
    private password;
}

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

4

5 回答 5

51

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

@Getter
@Setter
public class User {

    private userName;

    @Getter(onMethod = @__( @JsonIgnore ))
    @Setter
    private password;
}
于 2014-12-30T12:25:36.907 回答
12

最近我在使用 jackson-annotation 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)

于 2018-09-13T23:19:26.297 回答
2

这可能很明显,但我之前没有考虑过这个解决方案,但我浪费了很多时间:

@Getter
@Setter
public class User {

    private userName;

    @Setter
    private password;

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

正如 Sebastian 所说@__( @JsonIgnore ),可以解决此问题,但有时使用 onX Lombok 功能 (@__()) 可能会产生副作用,例如破坏 javadoc 生成。

于 2017-10-18T05:32:41.340 回答
1

我最近有同样的问题。

有几种方法可以解决它:

  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,那么你应该删除@JsonIgnorewith的所有用法@JsonIgnoreProperties(如解决方案 #4 中所述,或者你仍然可以选择解决方案 #2 或 #3)。这是必需的,因为@JsonIgnore注解不适用于构造函数参数。

  1. 手动定义 Getter / 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.

于 2020-09-22T15:09:11.943 回答
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

于 2018-12-03T09:37:15.617 回答