我有带有 REST API 的 Qurakus 应用程序
@Path("/hello")
public class ExampleResource {
@GET
@Consumes(MediaType.APPLICATION_JSON)
public ObjectNode hello() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
String str = "{\"var\": 0.000000009}";
ObjectNode object = (ObjectNode) objectMapper.readTree(str);
return object;
}
}
使用定制的 Jackson ObjectMapper 如下:
@Singleton
public class RegisterCustomModuleCustomizer implements ObjectMapperCustomizer {
public void customize(ObjectMapper mapper) {
mapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
}
}
在响应过程中,Jackson 没有调用自定义的 ObjectMapper,因此返回的值以科学计数法表示。
如果我使用下面的 POJO 进行响应,Jackson 会根据需要调用自定义的 ObjectMapper。
public class Entity {
public Entity() {
}
public Entity(BigDecimal value) {
this.value = value;
}
public BigDecimal value;
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
}
为什么 Jackson 忽略自定义的 ObjectMapper?
Jackson需要调用自定义的ObjectMapper。
ObjectMapperCustomizer
的实现仅适用于由CDI管理的ObjectMapper
类(这意味着它们不适用于在代码的随机部分使用new
创建的实例)