Spring JPA - 仅在持久性中忽略字段

时间:2018-04-23 16:55:11

标签: spring jackson

我有一个名为password的字段,可以由端点接收。但它不能作为响应发回或持久存储在数据库中

该课程如下 -

public class ShortURL {

@Pattern(regexp="^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]")
private String url;

@Size(min=8,max=16)
@Transient
private String password = null;

private boolean isPasswordProtected = false;

public String getUrl() {
    return url;
}
public void setUrl(String url) {
    this.url = url;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public boolean isPasswordProtected() {
    return isPasswordProtected;
}
public void setPasswordProtected(boolean isPasswordProtected) {
    this.isPasswordProtected = isPasswordProtected;
}
public ShortURL(
        @Pattern(regexp = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]") String url,
        @Size(min = 8, max = 16) String password, boolean isPasswordProtected) {
    super();
    this.url = url;
    this.password = password;
    this.isPasswordProtected = isPasswordProtected;
}

@Transient正常运作。但是在@JsonIgnore之后添加@Transient会导致问题 -

Type definition error: [simple type, class java.lang.String]; 
nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 
No fallback setter/field defined for creator property 'password'"

我如何实现自己的意图?

2 个答案:

答案 0 :(得分:1)

取决于你的杰克逊版本。

在1.9版之前,您可以将@JsonIgnore添加到password的getter中,并将@JsonProperty添加到password字段的setter中。

杰克逊的

Recent versionsREAD_ONLY提供WRITE_ONLY@JsonProperty注释参数,如下所示:

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

答案 1 :(得分:0)

是的,您可以使用@JsonIgnore让jackson在发送用户响应时忽略它,但是。您应遵循某些最佳做法。

永远不要将实体直接暴露给端点,而是更好地拥有一个包装器,即将您的实体转换为所需响应的DTO。 例如。在你的情况下

    public class ShortURL {
    @Pattern(regexp="^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]")
    private String url;
    @Size(min=8,max=16)
    private String password;
    private boolean isPasswordProtected;
    }

//这里是你可以创建参数化构造函数的dto 因此,根据您想要设置的字段调用它。

      public class ShortURLDTO {
        private String url;
    public ShortURLDTO(String url){
    this.url=url
    }
 }