我有一个Spring Boot应用程序,它公开了RESTAPI。此API接受枚举列表作为查询参数。该批状态用于根据其状态过滤所有批。
当试图调用这个RESTAPI时,我得到了以下错误
{
"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"
}
Spring正在BatchStatus中寻找active,而不是active。
深入研究spring转换服务,我发现了两个转换器。StringToEnumConverterFactory(来自Spring芯)
2。StringToEnumIgnoringCaseConverterFactory(来自spring boot)
Spring靴中是否有强制使用第二个转换器的机制?
进一步的调试表明,这两个转换器都注册了ConversionService,但是有多个ConversionService实例,每个实例具有不同数量的转换器。在这种情况下,Spring如何选择要使用的转换服务?
枚举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;
}
}
查看Spring项目的问题跟踪器,您可以发现这个问题,它基本上要求公开StringToEnumIgnoringCaseConverterFactory
类。
然而,它似乎不会很快发生,因为这仍在进行中。
您可以尝试通过WebMvcConfigrer#addForthy
配置转换器
@Configuration
class CustomWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addFormatters(final FormatterRegistry registry) {
ApplicationConversionService.configure(registry);
}
}
ApplicationConversionService#configure将通过调用addApplicationConverters方法为您注册stringtoenumignoringcasecoverterfactory
/** Spring Framework code */
public static void addApplicationConverters(ConverterRegistry registry) {
...
registry.addConverterFactory(new StringToEnumIgnoringCaseConverterFactory());
}
顺便说一句,这是对
StringToEnumIgnoringCaseConverterFactory
的唯一引用,所以这是你唯一的希望;)(不要使用Reflection
!抵制冲动)
本文向大家介绍grep 忽略大小写,包括了grep 忽略大小写的使用技巧和注意事项,需要的朋友参考一下 示例 给定一个文件sample: grep“ hello”的法线返回: 使用-i允许忽略大小写并匹配任何“ hello”:
问题内容: 即时通讯只是从C#-> Java移动。我需要使用junit编写一些测试。在我的测试中,我需要比较两个字符串以查看它们是否匹配。因此,我们也有Assert.assertEquals,但这是区分大小写的。如何使它不区分大小写?我需要的是: 返回true。 因此,在C#中,我们曾经有: 我很快就浏览了Junit文档,但似乎找不到任何东西。 问题答案: 我发现Hamcrest提供的断言必须比默
问题内容: 如何反序列化包含不区分大小写的枚举值的JSON字符串?(使用Jackson Databind) JSON字符串: 和我的Java POJO: 在这种情况下,使用JSON反序列化将在可行的地方失败。但出于命名约定的原因,我也想工作。 序列化POJO也会导致大写 我想到了使用@JsonGetter: 而且有效。但是我想知道是否有更好的解决方案,因为这对我来说似乎是hack。 我也可以编写一
我正在构建一个Spring Boot REST API。它有一个POST请求,用于将大型对象保存到Mongo数据库。我试图使用枚举来控制数据存储方式的一致性。例如,这是我对象的一部分: 我的问题:当我传入一个不是我的枚举的大写版本的值(例如“mobile”或“Mobile”)时,我得到以下错误: 我觉得应该有一种相对简单的方法来获取传递到API中的内容,将其转换为大写字母,将其与枚举进行比较,如果
问题内容: 是否可以确定String是否包含字符串模式?我想知道当字符不区分大小写时是否有可能。如果是这样,怎么办? 问题答案: 您可以使用 检查CharSequence是否包含搜索CharSequence(不区分大小写),处理为null。不区分大小写由String.equalsIgnoreCase(String)定义。 空的CharSequence将返回false。 这将比regex更好,因为
在这种情况下,如果验证失败,我希望将请求返回给用户,并附上相应的错误消息。我遇到的问题是,我使用Jackson处理JSON请求,验证失败也会导致Jackson无法序列化消息。 例如,如果我有此对象: ...当我去序列化时,字段无效(假设它有11个字符)... ...我得到了一个JsonProcessingException(错误验证对象)。我已经确认一个有效的对象序列化没有问题。所以我的问题是:我