我正在使用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的Classname:
{
"UserAccountDTO":
{
"id": 10,
"username": "Admin",
"firstname": "Administrator",
"lastname": null
}
}
为什么XML和JSON的输出不同?要在@XmlRootElement
-Annotation中获取指定的名称,我需要更改哪些内容
发布于 2018-08-17 13:50:51
我必须像这样将Jaxb模块注册到xml映射器中,否则@XmlRootElement(name = "myname")
就会出错。
JaxbAnnotationModule module = new JaxbAnnotationModule();
xmlMapper.registerModule(module);
发布于 2015-07-23 14:14:51
将.configure(SerializationFeature.WRAP_ROOT_VALUE, true)
更改为.configure(SerializationFeature.WRAP_ROOT_VALUE, false)
应该会有所帮助。
根据javadoc的说法
功能,可以使根值<..>包装在单个属性JSON对象中,其中key是“根名称”
https://stackoverflow.com/questions/31568687
复制