簡體   English   中英

傳遞給Jersey + Jackson時從實體中刪除字段

[英]Remove a field from entity when passing to Jersey + Jackson

我正在使用Jersey + Jackson(內置於Dropwizard中)創建一系列Web服務。 我通過將它們傳遞給Jersey中的Response對象來直接映射Json中的對象:

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

在myObject類中使用JsonProperty(“ fieldName”)正確注釋了字段。

但是,如果我有一個字段需要存儲到數據庫中(例如:密碼哈希),但又不想傳遞請求響應,那么當將該實體傳遞給Response對象時,如何刪除該字段?

我無法使用JsonIgnore注釋該字段,否則當我將Json映射到數據庫(ElasticSearch)時,該字段將根本不會序列化。

一種選擇是簡單地將字段設置為null 要將ObjectMapper配置為在字段為null時完全忽略JSON中的字段,您可以執行以下操作

@Override
public void run(YourConfiguration configuration,
        Environment environment) throws Exception {
    ...
    environment.getObjectMapper().setSerializationInclusion(Include.NON_NULL);
}

順便說一句,此安全原因是使用DTO(數據傳輸對象)的原因之一,DTO是一個額外的實體“視圖”層,它將我們從持久層(數據庫實體對象)發出的表示分開。 創建具有相同/相似屬性的另一個對象似乎是多余的,但是安全填充是值得的。

另外,盡管還不是正式版本, Dropwizard 0.8.0使用Jersey 2,它引入了Entity Filtering ,它使我們能夠過濾掉不需要發送的數據,而無需創建DTO。 只是以為我會提到它。

您應該同時使用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將用於反序列化。

實際上,@ Manikandan答案應該對您有用。 請參閱僅在序列化過程中使用@JsonIgnore,而不是反序列化

在最壞的情況下,您可以嘗試實現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;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM