我正在使用akka进行POST路由,在其中我将Json数据反序列化为Video对象,但是以下卷曲请求:
curl -H "Content-Type: application/json" -X POST -d '{"title": "Video Title","videoDate":"10-2-2018","videoTime":"12:10:11"}' http://localhost:9090/updatedData
出现错误:Cannot unmarshal JSON as Video
当我从json中删除videoDate和videoTime字段时,请求正常运行。
Jackson.unmarshaller(VideoInfo.class)
//Video.class
public class Video {
private String title;
private LocalDate videoDate;
private LocalTime videoTime;
}
使用的Maven依赖项是
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
这是我的路线/ updatedData
post(() ->
path("updatedData", () -> {
LOGGER.info("calling POST /updatedData");
return entity(Jackson.unmarshaller(Video.class), videoInfo -> {
LOGGER.debug("Payload received : " + videoInfo.toString());
ArrayList<HttpHeader> headers = getCORSHeaders();
return respondWithHeaders(headers, () ->
onSuccess(videoFrameProcessing.updateVideoInfo(videoInfo), this::complete));
});
})),
答案 0 :(得分:0)
Jackson需要Java 8 Time
API的附加module。
模块
jackson-datatype-jsr310
已被弃用,现已成为
的一部分jackson-modules-java8
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.8</version>
</dependency>
这意味着您需要手动注册该模块
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
Akka Jackson
类提供了unmarshaller
的重载版本,您可以使用它来传递ObjectMapper
的自定义版本
public static <T> Unmarshaller<HttpEntity, T> unmarshaller(ObjectMapper mapper, Class<T> expectedType) {
return Unmarshaller.forMediaType(MediaTypes.APPLICATION_JSON, Unmarshaller.entityToString())
.thenApply(s -> fromJSON(mapper, s, expectedType));
}
所以,而不是
Jackson.unmarshaller(Video.class)
使用
Jackson.unmarshaller(objectMapper, Video.class);
objectMapper
参数是自定义ObjectMapper
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
完整的代码段将是
post(() ->
path("updatedData", () -> {
LOGGER.info("calling POST /updatedData");
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
return entity(Jackson.unmarshaller(objectMapper, Video.class), videoInfo -> {
LOGGER.debug("Payload received : " + videoInfo.toString());
ArrayList<HttpHeader> headers = getCORSHeaders();
return respondWithHeaders(headers, () ->
onSuccess(videoFrameProcessing.updateVideoInfo(videoInfo), this::complete));
});
})),
很明显,将ObjectMapper
提取为“全局”变量。