我想在Java 8 java.time应用程序的上下文中将Dropwizard与Jersey/Jackson一起使用。我了解我需要使用jackson-modules-java8并配置mapper对象。

但是,如何配置Jersey的为我反序列化传入JSON的automagic映射器? IE。我在哪里做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;
  }
}

如您所见,它使用了较旧的Date API。 Jersey 资源如下所示:
@Path("/example")
@Consumes(MediaType.APPLICATION_JSON)
public class ExampleResource {
  @POST
  public void consume(Example example) {
    // Do stuff with example.date
  }
}

最佳答案

在Dropwizard 1.0.0及更高版本中,JavaTimeModuleregistered by default。对于以前的版本,dropwizard-java8捆绑包提供了对Java 8功能的支持。 Java 8是Dropwizard 1.0.0的基准,并且捆绑包是merged into baseline

假设您使用Dropwizard 1.0.0或更高版本,如果仍然需要访问ObjectMapper,则可以在Application<T>中进行操作:

方法void initialize(Bootstrap<T> bootstrap)中的

  • ,通过bootstrap.getObjectMapper()
  • 方法abstract void run(T configuration, Environment environment)中的
  • ,通过environment.getObjectMapper()

  • 这样,您可以注册其他模块,或启用或禁用Jackson功能。其中一些会影响how Java 8 types are serialized and deserialized

    关于json - 使用Dropwizard时配置Jackson映射器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53440362/

    10-12 03:49