![](/img/trans.png)
[英]Unsupported Media Type when using Jersey and Jackson from uberjar
[英]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.