Vik*_* V. 2 jackson spring-webflux
遇到了从 JSON 到 POJO 的 MyEnum 枚举反序列化问题,无法弄清楚我做错了什么。所以基本上我尝试检索一些调用特定微服务端点的数据,该端点返回以下 json:
{
"id": "9cabf3e9-965d-4407-b62b-c57dd6006419",
"myEnums": [
{
"context": "SOME_FOO_CONTEXT_1",
"feature": "SOME_BAR_FEATURE_1",
"name": "SOME_FOO_BAR_1"
},
{
"context": "SOME_FOO_CONTEXT_2",
"feature": "SOME_BAR_FEATURE_2",
"name": "SOME_FOO_BAR_2"
}
],
"name": "Some name",
"updatedBy": null,
"updated": "2019-05-16T00:11:19.279Z"
}
Run Code Online (Sandbox Code Playgroud)
这是调用另一个微服务端点、将响应正文反序列化为 POJO 并将结果作为 Set 返回的方法:
private Mono<Set<MyEnum>> fetchMyEnums(UUID someId) {
return webClient.get().uri("/v1/something/{id}", someId)
.retrieve()
.bodyToMono(MyClass.class)
.flatMapIterable(MyClass::getMyEnums)
.collect(toSet());
}
Run Code Online (Sandbox Code Playgroud)
用于JSON反序列化的类:
@lombok.Value
static class MyClass {
List<MyEnum> myEnums;
}
Run Code Online (Sandbox Code Playgroud)
我实际上无法反序列化的枚举:
@Getter
@RequiredArgsConstructor
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyEnum {
SOME_FOO_BAR_1(SOME_FOO_CONTEXT_1, SOME_BAR_FEATURE_1),
SOME_FOO_BAR_2(SOME_FOO_CONTEXT_2, SOME_BAR_FEATURE_2);
private final FooEnum context;
private final BarEnum feature;
private String name;
@JsonProperty
public String getName() {
return super.name();
}
}
Run Code Online (Sandbox Code Playgroud)
在反序列化过程中,我收到以下异常:
org.springframework.core.codec.DecodingException: JSON decoding error: Cannot deserialize instance of `com.learn.common.security.model.MyEnum` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.learn.common.security.model.MyEnum` out of START_OBJECT token
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.learn.common.security.service.MyEnumService$MyClass["myEnums"]->java.util.ArrayList[0])
Run Code Online (Sandbox Code Playgroud)
我哪里做错了?
因此,花了几个小时来澄清反序列化的问题是什么,我发现 Enum 的 Shape.Object 没有自动反序列化。
但我找到了如何从 json 反序列化 MyEnum 对象的解决方法(您需要定义将其标记为 JsonCreator 的静态方法,并定义您希望从使用 fieldName 定义 JsonProperty 的对象中捕获的输入参数):
@Getter
@RequiredArgsConstructor
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyEnum {
SOME_FOO_BAR_1(SOME_FOO_CONTEXT_1, SOME_BAR_FEATURE_1),
SOME_FOO_BAR_2(SOME_FOO_CONTEXT_2, SOME_BAR_FEATURE_2);
private final FooEnum context;
private final BarEnum feature;
private String name;
@JsonProperty
public String getName() {
return super.name();
}
@JsonCreator
public static MyEnum fromJson(@JsonProperty("name") String name) {
return valueOf(name);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2699 次 |
| 最近记录: |