使用 Dropwizard 时配置 Jackson 映射器

Fre*_*sen 5 json jersey jackson dropwizard

我想在Dropwizard应用程序的上下文中使用Java 8 java.time和 Jersey/Jackson 。我知道我需要使用jackson-modules-java8并配置映射器对象。

但是我如何配置 Jersey 的自动映射器来为我反序列化传入的 JSON?即我会在哪里做mapper.registerModule(new JavaTimeModule());

为了说明当前情况,这里是一个表示传入 JSON 的示例类:

public class Example {
  // Want to use java.time instead
  private Date date;
  private final String ISO_OFFSET_DATE_TIME = "YYYY-MM-DD'T'HH:mm:ssZ";

  @JsonCreator
  public Example(@JsonProperty("date") 
                 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = ISO_OFFSET_DATE_TIME) 
                 Date date) {
    this.date = date;
  }

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = ISO_OFFSET_DATE_TIME)
  public Date getDate() {
    return date;
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它使用了较旧的 Date API。Jersey 资源如下所示:

@Path("/example")
@Consumes(MediaType.APPLICATION_JSON)
public class ExampleResource {
  @POST
  public void consume(Example example) {
    // Do stuff with example.date
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

JavaTimeModule默认情况下,注册在Dropwizard 1.0.0及以上。对于以前的版本,dropwizard-java8包提供了对 Java 8 功能的支持。Java 8 是 Dropwizard 1.0.0 的基线,该包已合并到基线中

假设您使用 Dropwizard 1.0.0 或更高版本,如果您仍然需要访问ObjectMapper,您可以在您的Application<T>

  • 在方法中void initialize(Bootstrap<T> bootstrap),通过bootstrap.getObjectMapper()
  • 在方法中abstract void run(T configuration, Environment environment),通过environment.getObjectMapper()

这样,您可以注册其他模块,或者启用或禁用 Jackson 功能。其中一些会影响Java 8 类型的序列化和反序列化方式