这绝对不是仅在序列化期间使用 @JsonIgnore 而不是反序列化的副本。问题是相同的,但在Immutables的上下文中。
当模型(DTO/DAO)被修饰为不可变时,我无法在序列化期间选择性地@JsonIgnore 属性之一。假设我们有一个 UserDto,它被定义为一个 Immutable,如下所示
@Value.Immutable
@Value.Style(defaults = @Value.Immutable(copy = false), init = "set*")
@JsonSerialize(as = ImmutableUserDto.class)
@JsonDeserialize(builder = ImmutableUserDto.Builder.class)
public abstract class UserDto {
@JsonProperty("id")
@Value.Default
public int getId() {
return 0;
}
@JsonProperty("username")
public abstract String getUsername();
@JsonProperty("email")
public abstract String getEmail();
@JsonProperty("password")
public abstract String getPassword();
}
我相信可以期望在序列化过程中我们希望忽略password
服务响应中的 。
如果我们使用一个简单的类而不使用 Immutables,那么有很多方法可以实现这一点。例如 - 仅用 注释 getter @JsonIgnore
。或者,如果可能,定义一个不同的访问器方法(没有 get 前缀的东西)并且只定义常规的 setter 方法......等等。
如果我在 Immutables 访问器方法上尝试相同的密码,如下所示:
@Value.Immutable
@Value.Style(defaults = @Value.Immutable(copy = false), init = "set*")
@JsonSersonIgnoreialize(as = ImmutableUserDto.class)
@JsonDeserialize(builder = ImmutableUserDto.Builder.class)
public abstract class UserDto {
....
@JsonProperty("password")
@JsonIgnore
public abstract String getPassword();
}
然后,生成的 ImmutableUserDto 在 getter 和 setter 上添加 @JsonIgnore,如下所示。
@Generated(from = "UserDto", generator = "Immutables")
@SuppressWarnings({"all"})
@ParametersAreNonnullByDefault
@javax.annotation.Generated("org.immutables.processor.ProxyProcessor")
@Immutable
@CheckReturnValue
public final class ImmutableUserDto extends UserDto {
...
...
private final String password;
...
...
/**
* @return The value of the {@code password} attribute
*/
@JsonProperty("password")
@JsonIgnore
@Override
public String getPassword() {
return password;
}
...
...
...
@Generated(from = "UserDto", generator = "Immutables")
@NotThreadSafe
public static final class Builder {
...
...
private String password;
@JsonProperty("password")
@JsonIgnore
public final Builder setPassword(String password) {
this.password = password;
return this;
}
}
}
序列化将按预期工作。该password
属性将从 JSON 中排除。但是当我尝试反序列化时,出现以下错误:
java.lang.IllegalStateException: Cannot build UserDto, some of the required attributes are not set [password]
这很明显,因为 Immutables 也将 setter 添加@JsonIgnore
到了 setter 中。
该文档没有太大帮助。在他们的注意事项部分中,它只提到了以下关于@JsonIgnore
如果使用@JsonIgnore,您应该明确地使属性成为非强制性的。在 Immutables 中,可以通过 @Nullable、Optional 或 @Value.Default 将属性声明为非强制性的,它们的效果都不同,我们不会自动派生任何东西。
在诸如. @Nullable
_ Optional
_@Value.Default
password
我已经浏览了他们 GitHub 页面上的问题列表,并且有一个类似的问题,但用户要求稍微不同的用例,使用 @Nullable 可以解决在我的情况下不起作用的问题。
我也尝试在这里使用其中一个答案。仍然导致同样的错误。
看起来这不受 Immutables 库的支持。我自己创建了一个新问题。一旦我从用户那里得到一些关于 SOF 的反馈,我可能会创建一个sscce。