我的SpringBoot控制器的一个终结点定义为:

    @GetMapping(path = "/{custId}/items", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    @AuthorizationValidationStrategy
    public List<ItemDTO> getCustItemsByItemType(@PathVariable @SecureResource(CUST) Long custId, @RequestParam("itemType") List<ItemType> itemTypes) {
        return this.myFeignClient.findItemsByCustIdAndItemTypes(custId, itemTypes);
    }

其中ItemType是遵循我们部门编码约定的枚举,因此所有枚举常量("枚举实例")都将被命名为ALL_UPPER_CASE.

当查询以大写形式指定项目类型时,此终结点可以很好地工作.

如果项类型指定为小写,则Spring会立即抛出异常,而不会在将其传递给feign客户端之前将其大写.这是意料之中的,我理解为什么.

有没有办法使这样的终结点变得"灵活",即它可以平等地接受小写和大写的枚举常量?

例如:

  http://127.0.0.1:8080/1.0/custs/2/items?itemType=bread
  http://127.0.0.1:8080/1.0/custs/2/items?itemType=BREAD

我实际上使用众所周知的@JsonCreator技术实现了这个枚举,虽然它的比较不区分大小写,但HTTP请求永远不会达到这个阶段.

推荐答案

在Java中,使用大写字母定义枚举值被认为是很好的做法,因为它们是常量.但是,我们可能希望在请求URL中支持小写字母.

在这种情况下,我们需要创建一个自定义转换器:

public class StringToEnumConverter implements Converter<String, Modes> {
    @Override
    public Modes convert(String source) {
        return Modes.valueOf(source.toUpperCase());
    }
}

Modes是我的枚举.您可以在此处替换为您的枚举.

要使用我们的定制转换器,我们需要在Spring配置中注册它:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToEnumConverter());
    }
}

Java相关问答推荐

编译期间错误(Java 0000)Android .Net MAUI

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

弹簧靴和龙目岛

在Java Stream上调用collect方法出现意外结果

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

使用REST客户端和对象映射器从字符串反序列化Json

在Java 15应用程序中运行Java脚本和Python代码

有没有可能在时间范围内得到多种解决方案?

如何使用Criteria Builder处理一对多关系中的空值?

Android应用程序为错误的显示类型 Select 尺寸文件

A.ForEach与For(类型a:集合)

try 使用预准备语句占位符获取信息时出现Try-With-Resources错误

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

设置背景时缺少Android编辑文本下划线

如何使用我的RLE程序解决此问题

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为

如何调查进程列表中不可见的活跃 MySQL 事务?

有没有办法仅将 JComboBox 中的选定项目居中(因此保持组合框中的所有项目左对齐)