传球给泽西+杰克逊时,从实体中移除一个场地

时间:2015-01-08 14:13:48

标签: java json jersey jackson dropwizard

我正在使用Jersey + Jackson(内置Dropwizard)来创建一系列Web服务。我通过将它们传递给Jersey中的Response对象直接映射Json中的对象:

myObject object = new myObject(fields...);
return Response.ok(object).build();

使用JsonProperty(“fieldName”)在myObject类中正确注释字段。

但是,如果我有一个需要存储到数据库的字段(例如:密码哈希),但我不想传递请求响应,如何在将实体传递给Response对象时删除该字段?

我无法用JsonIgnore注释该字段,否则当我将Json映射到数据库(ElasticSearch)时,该字段根本不会被序列化。

3 个答案:

答案 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;
    }

}