Spring Rest Post请求枚举属性

时间:2017-09-06 13:39:20

标签: json spring enums jackson spring-rest

我使用Spring版本4.2和Spring启动。我有一个帖子请求 http://localhost:3000/api/standards/ 我有以下json请求正文

{
"standardName": "MyStandard",
"language": "Java",
}

我想要的只是保存标准实体。 StandardEntity的'language'属性是Enum类型。 我的Controller方法看起来像这样

@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Standard> createStandard(@Validated @RequestBody Standard standard ) {
        standardService.createStandard(standard);
        return new ResponseEntity<Standard>(standard, HttpStatus.CREATED);

    }

但是在控制器内部,standard.getLangauge()始终为null。 我已经尝试了 @InitBinder 并将 @JsonCreator 添加到语言枚举中,但它们都不适用于我。 我的Enum看起来像这样

public enum Language {
@JsonProperty("java")Java("java"), 
@JsonProperty("sql")Sql("sql");

private String value;

private Language(String value) {
    this.value = value;
}

public static Language fromValue(String value) {
    for (Language language : values()) {
        if (language.value.equalsIgnoreCase(value)) {
            return language;
        }
    }
    throw new IllegalArgumentException(
            "Unknown enum type " + value + ", Allowed values are " + Arrays.toString(values()));
}

@Override
public String toString() {
    return value;
}

@JsonCreator
public static Language create(String value) {
    System.out.println("in json creator "+value);
    if (value == null) {
        throw new IllegalArgumentException();
    }
    for (Language v : values()) {
        if (value.equals(v.getShortName())) {
            return v;
        }
    }
    throw new IllegalArgumentException();
}

1 个答案:

答案 0 :(得分:0)

您的请求应为“java”而非“Java”

{
    "standardName": "MyStandard",
    "language": "java"
}

当您发送“Java”时,它无法将其映射到任何枚举,所以理想情况下它应该抛出HttpMessageNotReadableException类型的异常,检查堆栈跟踪应该有这样的异常。