2014-01-17 103 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