2.7.9.2. JAXB 和 JSON 提供程序
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; } }