【问题标题】:Configuring Jackson mapper when using Dropwizard使用 Dropwizard 时配置 Jackson 映射器
【发布时间】:2019-04-25 16:37:34
【问题描述】:

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

但是我该如何配置 Jersey 的自动映射器来为我反序列化传入的 JSON? 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
  }
}

【问题讨论】:

    标签: json jackson jersey dropwizard


    【解决方案1】:

    JavaTimeModule 在 Dropwizard 1.0.0 及更高版本中是 registered 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

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2023-03-29
      • 2016-12-28
      • 2020-01-18
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      相关资源
      最近更新 更多