我有一个名为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'"
我如何实现自己的意图?
答案 0 :(得分:1)
取决于你的杰克逊版本。
在1.9版之前,您可以将@JsonIgnore
添加到password
的getter中,并将@JsonProperty
添加到password
字段的setter中。
Recent versions为READ_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
}
}