搜索

2.7.9.2. JAXB 和 JSON 提供程序

download PDF

RESTEasy 允许您使用 JSON 提供程序来回发注释的 POJO 并从 JSON 托管 JAXB。此提供程序打包了 Jackson JSON 库以完成此任务。它具有与 JAXB 类似的基于 Java Bean 的模型和 API。

Jackson 已包含 Jakarta RESTful Web 服务集成,但它已由 RESTEasy 扩展。若要将它包含在您的项目中,您需要更新 Maven 依赖项。

Jackson 的 Maven 依赖项

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson2-provider</artifactId>
    <version>${version.org.jboss.resteasy}</version>
    <scope>provided</scope>
</dependency>

注意

RESTEasy 的默认 JSON 提供程序是 Jackson2。早期版本的 JBoss EAP 包含 Jackson1 JSON 提供程序。有关将现有应用从 Jackson1 提供商迁移的更多详细信息,请参阅 JBoss EAP 迁移指南。如果您仍然要使用 Jackson1 提供程序,您必须明确更新 Maven 依赖项来获取它

注意

以前版本的 JBoss EAP 中 RESTEasy 的默认 JSON 提供程序是 Jettison,但现已在 JBoss EAP 7 中弃用。如需了解更多详细信息,请参阅 JBoss EAP迁移指南

JSON 提供程序示例

@XmlRootElement
public static class Thing {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

@Path("/test")
public static class TestService {
  @GET
  @Path("/thing")
  @Produces("application/json")
  public Thing get() {
    Thing thing = new Thing();
    thing.setName("the thing");
    return thing;
  }
}

2.7.9.2.1. Java 8 的 Jackson 模块支持

本节提供 Maven 依赖项,并演示如何在核心 Jackson 模块不需要 Java 8 运行时环境时注册支持 Java 8 功能所需的 Jackson 模块。Jackson 模块包括:

  • Java 8 数据类型
  • Java 8 日期/时间

添加以下 Maven 依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

您可以使用 findAndRegisterModules()ObjectMapper.registerModule() 找到并注册所有模块,如下例所示:

ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
ObjectMapper mapper = new ObjectMapper()
   .registerModule(new ParameterNamesModule())
   .registerModule(new Jdk8Module())
   .registerModule(new JavaTimeModule());

示例:持续时间数据类型

@GET
@Path("/duration")
@Produces(MediaType.APPLICATION_JSON)
public Duration getDuration() {
    return Duration.ofSeconds(5, 6);
}

示例:可选数据类型

@GET
@Path("/optional/{nullParam}")
@Produces(MediaType.APPLICATION_JSON)
public Optional<String> getOptional(@PathParam("nullParam") boolean nullParameter) {
    return nullParameter ? Optional.<String>empty() : Optional.of("info@example.com");
}

您必须使用 ContextResolver 的自定义实施,才能在 RESTEasy 中使用这些 Jackson 模块。

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonDatatypeJacksonProducer implements ContextResolver<ObjectMapper> {
    private final ObjectMapper json;
    public JacksonDatatypeJacksonProducer() throws Exception {
        this.json = new ObjectMapper()
                .findAndRegisterModules()
                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
    @Override
    public ObjectMapper getContext(Class<?> objectType) {
        return json;
    }
}
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.