当前位置: 首页 > 知识库问答 >
问题:

如何在SpringBoot/Swagger中使枚举参数小写?

钱青青
2023-03-14

我有以下endpoint

@GetMapping(value = "/mypath/{mychoice}")
public ResponseClass generateEndpoint(
        @PathVariable("mychoice") FormatEnum format,
    )  {

...

和下面的枚举Jackson注释

@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public enum Format {
    AVRO,
    ORC,
    PARQUET,
    PROTOBUF
}

我希望,@JsonNaming注释会告诉斯威格用小写字母显示案例,但事实并非如此

@JsonProperty添加到每个案例中也没有帮助。

它也不接受带有错误的小写URL

org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'FormatEnum'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam FormatEnum] for value 'avro'; nested exception is java.lang.IllegalArgumentException: No enum constant FormatEnum.avro

设置

 spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true 

无效(并且在代码中为true)。

看起来它只是没有使用Jackson来反序列化enum!


共有1个答案

卞嘉许
2023-03-14

设置spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS=true不起作用的原因可以在Konstantin Zyubin的回答中找到。

受上述答案的启发,我们可以有一个更通用的方法来处理请求参数中不区分大小写的枚举。

变流器等级

import org.springframework.core.convert.converter.Converter;

public class CaseInsensitiveEnumConverter<T extends Enum<T>> implements Converter<String, T> {
    private Class<T> enumClass;

    public CaseInsensitiveEnumConverter(Class<T> enumClass) {
        this.enumClass = enumClass;
    }

    @Override
    public T convert(String from) {
        return T.valueOf(enumClass, from.toUpperCase());
    }
}

添加配置

import com.example.enums.EnumA;
import com.example.enums.EnumB;
import com.example.enums.FormatEnum;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        List<Class<? extends Enum>> enums = List.of(EnumA.class, EnumB.class, FormatEnum.class);
        enums.forEach(enumClass -> registry.addConverter(String.class, enumClass,
                      new CaseInsensitiveEnumConverter<>(enumClass)));
    }
}

相关:杰克逊数据库枚举不区分大小写

 类似资料:
  • 我正在尝试检查我的VO中设置了哪些值。 下面是我的女儿。我得到的是“合格的病例标签MyEnum.UserType.Doctors必须替换为不合格的枚举常量Doctors” EnumTest.java

  • 无法获取如何将字符串类型的引用与数组参数中的枚举值一起使用。我可以在items键中进行引用,并且它正在工作,但Swagger产生错误:不是有效的参数定义 Web UI生成界面,但它有文本区,而不是我期望的多选框。 正确的做法是什么? 我的代码:

  • 问题内容: 我有一个电影租借系统的现有数据库。每部电影都有一个评级属性。在SQL中,他们使用约束来限制此属性的允许值。 我认为使用Java枚举将约束映射到对象世界会很好。但是由于“ PG-13”和“ NC-17”中的特殊字符,不可能简单地获取允许的值。因此,我实现了以下枚举: 使用toString()方法,方向enum-> String可以正常工作,但是String-> enum不能正常工作。我得

  • 问题内容: 我有这样声明的方法 这个枚举 问题:如何模拟通话?我无法比拟。 以下无效: 问题答案: 将达到目的: 附带说明:考虑使用静态导入: 模拟变得更短:

  • 我正在使用从以下依赖项导入的Swagger/OpenAPIV3注释创建应用程序的API描述: 其中一个批注是批注,它接受名为的属性,该属性允许字符串数组: 现在,我想使用在枚举类上构造的自定义方法,该方法返回允许的字符串数组,因此不需要在每次向枚举添加类型时添加该方法。以便我们可以这样使用它: 现在这是无法编译的,因为在执行注释时不知道该方法。是否有这样的解决方案允许在SwaggerV3注释属性值

  • 我的Rest API中有一个字段(在++中实现),它是一组封闭的数值。例如,员工等级,它可以是以下值之一:。而不是,则不能为每个值定义匹配字符串。 我正在尝试获得生成的文档,以便为这些值提供一个数字枚举。我尝试了以下方法: > 使用以下属性定义整数:。没有显示任何枚举,只是在将的类型更改为之后。因此不幸的是,只能与String参数一起工作,而我不希望我的模型是这样的。employeeRank必须是