如何在返回 JAX-RS 响应时更改 POJO 属性名称



我想使用缺省的 JAX-RS 响应反序列化程序。

这是我的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":"example@isp.com","to":[ ],"cC":[ ],"bCc":[ ],"subject":"my subject","text":"email from admin"}]

我想将"cC"更改为"carbon_copy"。我想使用 JAX-RS 响应来解决这个问题。如何让 JAX-RS 使用杰克逊注释的属性名称。我需要覆盖某些内容吗?

我目前的实现我做了以下操作。

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();

是否可以在不创建另一个类来处理反序列化过程的情况下执行此操作。

Mix-in可以帮助您解决此问题。你需要创建一个抽象类,比如"EmailExpanded",其属性如下所示:

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

然后添加该混合:

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

稍后在发送响应时的代码中:

emailExpandMapper.writeValueAsString(emails)

您可以在网络上阅读有关Mixins的更多信息。

最新更新