java - 在 JAXB 中自动添加根元素

标签 java rest spring-boot jaxb jersey

在 Jersey 中,如何自动在 JAXB pojo 中添加 root?

我有我的 JAXB pojo

class Product {
   private String name;
   ....
}

默认生成的json是

{
    "name": "Burton Custom Freestlye 151",
}

我希望是这样

{
  "product": {
    "name": "Burton Custom Freestlye 151",
  }
}

注意:我所说的自动并不是为了封装另一个pojo而创建单独的类。

这应该序列化/反序列化为 JSON。

此外,我还有其他 JSON 不使用根元素。

最佳答案

使用 Spring Boot,您只需将 ObjectMapper 配置为 Spring bean,并且在 Jersey 将使用映射器的位置设置 Spring Boot。 ObjectMapper 自动添加根元素的配置属性是

SerializationFeature.WRAP_ROOT_VALUE

默认行为是采用类名并将其小写。如果您想要不同的东西,可以使用 @XmlRootElement("newName")@JsonRootName("newName") 注释该类。要制作 Spring bean,只需在配置类中添加以下内容

@Bean
public ObjectMapper mapper() {
    final ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRAP_ROOT_NAME, true);
    return mapper;
}

注意我认为这个(为 ObjectMapper 创建 Spring bean)仅从 1.4.0 开始可用。如果您使用的是早期版本的 Boot,则应该只是 do this .

此外,如果您期望传入带有包装值的 JSON,您还需要解开它。你可以这样做

DeserializationFeature.UNWRAP_ROOT_VALUE

按照与上面相同的方式进行配置(传递true)。

<小时/>

更新

(目前不是很有用,但将来也许有用)

查看source for @JsonRootName ,似乎 Jackson 从 2.4 开始就计划在注释中添加一个 alwaysWrap 属性。但我猜他们一直在拖延这件事。不知道为什么。也许将来它会出现。

关于java - 在 JAXB 中自动添加根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39719714/

相关文章:

java - 为什么向上转换一个类不会改变重写的方法?

c# - 在 C# 中没有等效项的 Java 语言功能

java - OpenCV JNI : Java/native handling of Mat - possibility for delete getting called twice?

java - ReSTLet:所有 500 个错误的日志堆栈跟踪

java - Spring Boot Controller 重定向不起作用

java - 在动态信封中包装 json 响应 - Rest api

java - 牛顿法在 Java 中的递归

没有请求正文的 REST API PATCH

Python 和 JSON 错误 - TypeError : string indices must be integers

java - ElasticSearch 日期转换为 Java LocalDateTime 失败