【发布时间】:2020-10-27 13:38:53
【问题描述】:
我有两种方法:
- “JSON 正文”请求
- “表单参数”请求
@RequestMapping(value = "/orders.json", consumes = { "application/json" }, method = RequestMethod.POST)
@Override
public ResponseEntity<Void> createOrder(@Valid @RequestBody OrderCreateDTO orderCreateDTO) {
return doCreateOrder(orderCreateDTO);
}
@RequestMapping(value = "/orders.json", consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.POST)
public ResponseEntity<Void> createOrderForm(@Valid @ModelAttribute OrderCreateDTO orderCreateDTO) {
return doCreateOrder(orderCreateDTO);
}
第二种方法很好,但是第一种方法有问题。 在该方法中,当我发送枚举字段时,出现以下错误:
JSON parse error: Cannot construct instance of `......service.dto.EuropeanLanguageEnumTypeDTO`, problem: Unexpected value 'EN'; nested exception is com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of `......service.dto.EuropeanLanguageEnumTypeDTO`, problem: Unexpected value 'EN'\n at [Source: (PushbackInputStream); line: 6, column: 17] (through reference chain: ......service.dto.OrderCreateDTO[\"language\"])
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `.......service.dto.EuropeanLanguageEnumTypeDTO`, problem: Unexpected value 'EN'; nested exception is com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of `......service.dto.EuropeanLanguageEnumTypeDTO`, problem: Unexpected value 'EN'
at [Source: (PushbackInputStream); line: 6, column: 17] (through reference chain: ......service.dto.OrderCreateDTO["language"])]
EuropeanLanguageEnumTypeDTO.java:
public enum EuropeanLanguageEnumTypeDTO {
BG("bg"),
HR("hr"),
CS("cs"),
EN("en");
private String value;
EuropeanLanguageEnumTypeDTO(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
@Override
public String toString() {
return String.valueOf(value);
}
@JsonCreator
public static EuropeanLanguageEnumTypeDTO fromValue(String value) {
for (EuropeanLanguageEnumTypeDTO b : EuropeanLanguageEnumTypeDTO.values()) {
if (b.value.equals(value)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected value '" + value + "'");
}
}
另外,我还有另一个组件来转换枚举,但它只适用于“表单”请求:
@Component
public class EuropeanLanguageEnumConverter implements Converter<String, EuropeanLanguageEnumTypeDTO> {
@Override
public EuropeanLanguageEnumTypeDTO convert(String value) {
return EuropeanLanguageEnumTypeDTO.fromValue(value);
}
}
工作 JSON 和不工作的示例:
成功:
{
"language": "en"
}
失败:
{
"language": "EN"
}
我需要使用大小写。
我搜索了很多,尝试了一些不同的方法,例如jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS: true,但没有奏效,请帮我解决这个问题。
附:由于某种原因,我无法在 ENUM 类中进行编辑,因为它将使用 openAPI 生成。
【问题讨论】: