我正在使用Jersey + Jackson(内置Dropwizard)来创建一系列Web服务。我通过将它们传递给Jersey中的Response对象直接映射Json中的对象:
myObject object = new myObject(fields...);
return Response.ok(object).build();
使用JsonProperty(“fieldName”)在myObject类中正确注释字段。
但是,如果我有一个需要存储到数据库的字段(例如:密码哈希),但我不想传递请求响应,如何在将实体传递给Response对象时删除该字段?
我无法用JsonIgnore注释该字段,否则当我将Json映射到数据库(ElasticSearch)时,该字段根本不会被序列化。
答案 0 :(得分:2)
一种选择是简单地将字段设置为null
。要将ObjectMapper
配置为在字段为空时完全忽略JSON中的字段,您只需执行
@Override
public void run(YourConfiguration configuration,
Environment environment) throws Exception {
...
environment.getObjectMapper().setSerializationInclusion(Include.NON_NULL);
}
顺便说一下,这个安全性原因是使用DTO(数据传输对象)的原因之一,这是一个额外的实体“视图”层,用于分隔我们从持久层(db实体对象)发出的表示。使用相同/相似的属性创建另一个对象似乎是多余的,但安全填充是值得的。
此外,虽然尚未正式发布,但Dropwizard 0.8.0使用引入Entity Filtering的泽西2,它允许我们过滤掉我们不想发送的数据,而无需创建DTO 。我以为我会提到它。
答案 1 :(得分:0)
您应该使用JsonIgnore和JsonProperty来实现这一目标。
public class User {
private String name;
private String password;
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
@JsonIgnore
public String getPassword() {
return this.password;
}
}
关于setter方法的@JsonProperty将用于序列化和&关于getter方法的JsonIgnore将用于反序列化。
答案 2 :(得分:0)
实际上@Manikandan的回答应该适合你。见Only using @JsonIgnore during serialization, but not deserialization
在最坏的情况下,您可能会尝试实施JsonSerializer。
public class MyObjectSerializer extends JsonSerializer<MyObject> {
@Override
public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeString(value.getField1());
jgen.writeString(value.getField2());
/* and not include field that you don't want to serialize */
jgen.writeEndObject();
}
}
@JsonSerialize(using = MyObjectSerializer.class)
public class MyObject {
String field1;
Integer field2;
String fieldNotToBeSerialized;
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public Integer getField2() {
return field2;
}
public void setField2(Integer field2) {
this.field2 = field2;
}
public String getFieldNotToBeSerialized() {
return fieldNotToBeSerialized;
}
public void setFieldNotToBeSerialized(String fieldNotToBeSerialized) {
this.fieldNotToBeSerialized = fieldNotToBeSerialized;
}
}