【问题标题】:JAX-RS JAXB Jackson not using @XmlRootElement nameJAX-RS JAXB Jackson 不使用 @XmlRootElement 名称
【发布时间】:2015-10-12 15:45:12
【问题描述】:

我正在使用 JAX-RS 和 JAXB 开发一个安静的应用程序。我想将以下实体作为 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-Annotation 中获取指定名称

【问题讨论】:

  • 为什么启用WRAP_ROOT_VALUE
  • 找到任何答案了吗?这里同样的问题。看起来 Jackson 包装器忽略了 name 属性

标签: java json jaxb jackson jax-rs


【解决方案1】:

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

根据javadoc

可以启用以使根值 <..> 包装在单个属性 JSON 对象中的功能,其中键作为“根名称”

【讨论】:

  • 如果我将其更改为.configure(SerializationFeature.WRAP_ROOT_VALUE, false),则响应数据中缺少根节点。我的问题中提到的 JSON 很好,只是它不代表@XmlRootElement 中给出的名称
  • @Develman 哦,我误会了你。要使用 jaxb 注释,您应该注册 jaxb 模块。是你做的吗?见“使用”github.com/FasterXML/jackson-module-jaxb-annotations
【解决方案2】:

我不得不像这样将 Jaxb 模块注册到 xml 映射器,否则 @XmlRootElement(name = "myname") 是igonerd。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2014-07-14
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多