JAX-RS JAXB Jackson没有使用@XmlRootElement名称

时间:2015-07-22 16:19:28

标签: java json jaxb jackson jax-rs

我正在使用JAX-RS和JAXB开发一个restful应用程序。我想将以下实体作为JSON发送给我的客户:

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class UserDTO implements Serializable
{
    private static final long serialVersionUID = 1L;

    private Long id;
    private String username;
    private String firstname;
    private String lastname;

    // getter & setter
}

我的WebService中的方法定义如下:

@POST
@Path("users/{id}")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public UserAccountDTO login(@PathParam("id") Long id)
{
    UserAccountDTO userAccount = loadUserAccount(id);
    return userAccount;
}

第一个问题是,根节点不是通过JSON发送的。因此我添加了以下类:

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class SkedFlexContextResolver implements ContextResolver<ObjectMapper>
{
    private ObjectMapper objectMapper;

    public SkedFlexContextResolver() throws Exception
    {
        this.objectMapper = new ObjectMapper().configure(SerializationFeature.WRAP_ROOT_VALUE, true);
    }

    @Override
    public ObjectMapper getContext(Class<?> objectType)
    {
        return objectMapper;
    }
}

现在,根节点与数据一起发送。在XML的情况下,一切都很好(根节点等于@XmlRootElement的名称)。请参阅以下XML响应:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
  <id>10</id>
  <username>Admin</username>
  <firstname>Administrator</firstname>
</user>

但是在JSON的情况下,根节点是POJO的类名:

{
    "UserAccountDTO":
    {
        "id": 10,
        "username": "Admin",
        "firstname": "Administrator",
        "lastname": null
    }
}

为什么XML和JSON之间的输出不同?我需要更改以获取@XmlRootElement - 注释

中的指定名称

2 个答案:

答案 0 :(得分:1)

.configure(SerializationFeature.WRAP_ROOT_VALUE, true)更改为.configure(SerializationFeature.WRAP_ROOT_VALUE, false)应该会有所帮助。

根据javadoc

  

可以启用以创建根值&lt; ..&gt;的功能包装在单个属性JSON对象中,其中key作为“根名称”

答案 1 :(得分:0)

我必须像这样将Jaxb模块注册到xml映射器中,否则@XmlRootElement(name = "myname")就已经成为问题了。

JaxbAnnotationModule module = new JaxbAnnotationModule();
xmlMapper.registerModule(module);