我有一个 spring-boot 应用程序,它暴露了Rest API https://i.stack.imgur.com/DT1tp.png。此 API 接受枚举列表batchStatus
作为查询参数。这batchStatus
用于根据状态过滤所有批次。
当尝试调用此 REST API 时,出现以下错误
{
"timestamp": 1552587376808,
"status": 400,
"error": "Bad Request",
"message": "Failed to convert value of type 'java.lang.String[]' to required type 'java.util.List'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@io.swagger.annotations.ApiParam @javax.validation.Valid @org.springframework.web.bind.annotation.RequestParam com.netshell.test.spring.conversion.rest.api.model.BatchStatus] for value 'active'; nested exception is java.lang.IllegalArgumentException: No enum constant com.netshell.test.spring.conversion.rest.api.model.BatchStatus.active",
"path": "/batch/status"
}
春天正在寻找active在 BatchStatus 中而不是ACTIVE.
深入研究 spring ConversionService 我发现了两个转换器
1. StringToEnumConverterFactory(来自spring-core)
2. StringToEnumIgnoringCaseConverterFactory(来自 spring-boot)
spring-boot 中是否有任何机制强制使用第二个转换器?
进一步的调试表明,两个转换器都已注册到 ConversionService,但是有conversionService 的多个实例 https://i.stack.imgur.com/Ya6zY.png每个都有不同数量的转换器。在这种情况下,spring如何选择使用哪个conversionService?
Enum BatchStatus
创建如下
public enum BatchStatus {
ACTIVE("active"),
FAILED("failed"),
HOLD("hold");
private String value;
BatchStatus(String value) {
this.value = value;
}
@Override
@JsonValue
public String toString() {
return String.valueOf(value);
}
@JsonCreator
public static BatchStatus fromValue(String text) {
for (BatchStatus b : BatchStatus.values()) {
if (String.valueOf(b.value).equals(text)) {
return b;
}
}
return null;
}
}