2014-01-17 41 views
0

我想使用默認的JAX-RS響應解串器。如何在返回JAX-RS響應時更改POJO屬性名稱?

這裏是我的POJO

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Email 
{ 
    private String  mFrom; 
    private List<String> mTo; 
    private List<String> mCc; 
    private List<String> mBcc; 
    private String  mSubject; 
    private String  mText; 

public void setFrom(String from) 
{ 
    mFrom = from; 
} 

@JsonProperty("from") 
public String getFrom() 
{ 
    return mFrom; 
} 

@JsonProperty("to") 
public List<String> getTo() 
{ 
    return mTo; 
} 

public void setTo(List<String> to) 
{ 
    mTo = to; 
} 

@JsonProperty("carbon_copy") 
public List<String> getCc() 
{ 
    return mCc; 
} 

public void setCc(List<String> cc) 
{ 
    mCc = cc; 
} 

@JsonProperty("blind_carbon_copy") 
public List<String> getBcc() 
{ 
    return mBcc; 
} 

public void setBcc(List<String> bcc) 
{ 
    mBcc = bcc; 
} 
} 

這是我的JAX-RS碼。

@GET 
@Produces("application/json", "application/xml", "text/xml") 
public Response getEmails() { 
    List<Email> emails = getEmails(); //returns list of emails 
    return Response.ok(emails).build(); 
} 

輸出

[{"from":"[email protected]","to":[ ],"cC":[ ],"bCc":[ ],"subject":"my subject","text":"email from admin"}] 

我想 「CC」 更改爲 「carbon_copy」。我想用JAX-RS響應來解決這個問題。我如何讓JAX-RS使用jackson註釋的屬性名稱。我是否需要重寫某些內容?

我目前的實施我做了以下。

public class JsonDeserializer 
{ 
    private static ObjectMapper mMapper; 
    static 
    { 
     mMapper = new ObjectMapper(); 
     mMapper.setSerializationInclusion(Inclusion.NON_NULL); 
    } 

    @SuppressWarnings({ "unchecked", "rawtypes" }) 
    public static <T> T fromInputStream(InputStream is, Class t) 
    { 
     try 
     { 
      return (T) mMapper.readValue(is, t); 
     } 
     catch (JsonParseException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (JsonMappingException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (ClassCastException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Response.ok(JsonDeserializer.toJson(emails)).build(); 

有沒有創建另一個類來處理反序列化過程。

回答

1

混入可以幫助您解決此問題。您需要創建一個抽象類,說有屬性是這樣的「EmailExpanded」:當你發送響應

emailExpandMapper = new ObjectMapper(); 
emailExpandMapper.getSerializationConfig().addMixInAnnotations(
      Email.class, EmailExpanded.class); 
emailExpandMapper.getSerializationConfig().setSerializationInclusion(
      Inclusion.NON_NULL); 

在後面的代碼:

@JsonProperty("carbon_copy") 
public abstract List<String> getCc(); 

然後添加混入

emailExpandMapper.writeValueAsString(emails) 

您可以在網上閱讀更多關於Mixins的信息。

+0

使用這種方法,我將不得不爲每個我想改變的屬性創建一個對象映射器。你知道如果有另一種方式。我現在的解決方案,我把傑克遜ObjectMapper放入一個靜態類,並反序列化它。 – James