首页 > 解决方案 > 使用 @JsonValue 的枚举反序列化不适用于 int 值。它使用索引值而不是实际值

问题描述

使用完成的枚举转换@JsonValue不适用于杰克逊中的int值。在转换期间,它使用枚举索引值而不是实际值。@JsonValue属性适用于字符串枚举

我正在使用 Spring Boot 2.2.2.RELEASE

控制器

@PostMapping("/test")
    public ResponseEntity enumTest(@RequestBody Request request ){
        log.info(request.toString());
        return ResponseEntity.status(HttpStatus.OK).build();
    }  

请求对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Request {
    private IntEnum intEnum;
    private  StringEnum stringEnum;
}

String Enum //@jsonValue 适用于 StringEnum 类

public enum  StringEnum {

    FIRST("first"),SECOND("second");
    @JsonValue
    private final String stringValue;
        StringEnum(String second) {
        this.stringValue=second;
    }
}

整数枚举

public enum IntEnum {
    ONE(1), TEN(10);    
    @JsonValue
    private final int intValue;    
    IntEnum(int i) {
        this.intValue = i;    
    }
}

@jsonValue不适用于 intEnum 类,

如果我在请求中传递 1 它正确地转换为枚举值ONE但是如果我在请求中传递 10 它说

index value outside legal index range [0..1]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.example.demo.IntEnum` from number 10: index value outside legal index range [0..1]\n at [Source: (PushbackInputStream); line: 2, column: 15] (through reference chain: com.example.demo.Request[\"intEnum\"])",

json请求

{
    "intEnum":10,
    "stringEnum":"first" 
 }

标签: spring-bootjackson

解决方案


我能够使用For @JsonValue 和整数让它工作我们需要显式添加 JsonCreator@JsonCreator

public enum IntEnum {
    ONE(1), TEN(10);

    @JsonValue
    private final int intValue;

    IntEnum(int i) {
        this.intValue = i;
    }

    @JsonCreator
    public static IntEnum fromNumber(int number) {
        for (IntEnum b : IntEnum.values()) {
            if (b.intValue == number) {
                return b;
            }
        }
        return null;
    }

}

推荐阅读