【问题标题】:Accept and parse integer for Enum type query parameter in Java接受并解析 Java 中枚举类型查询参数的整数
【发布时间】:2021-12-01 01:59:17
【问题描述】:

我的 Spring Boot 应用程序中的 API 有一个 Enum 类型的查询参数。 从邮递员那里,它只接受Enum 字符串值。当作为查询参数值发送时,它以 400 作为整数响应。 如何配置 Spring Boot 应用程序以接受 Enum 字符串值或 Enum 索引/序数值作为查询参数。

以下两种方式都应该有效

  1. <base-url>/123/status?status=inprogress
  2. <base-url>/123/status?status=2 (2 是进度索引enum

我正在使用 Java,spring boot fw。 它在 dotNet 中运行良好

【问题讨论】:

    标签: java .net spring spring-boot api


    【解决方案1】:

    据我所知,没有办法通过注释左右神奇地做到这一点。您可以做的是实现一个自定义转换器并将输入的值转换为您的enum,如下所示:

    public class MyCustomEnumConverter implements Converter<String, YourEnum>
    {
        @Override
        public YourEnum convert(String source) {
            try
            {
                if(isNumeric(source)) // If the string passed is a Number
                {
                    int index = Integer.parseInt(source); 
                    return YourEnum.values()[index]; // Get the Enum at the specific index
                }
                // Else if it is a string..
                return YourEnum.valueOf(source);
            } catch(Exception e) {
                return null; // or whatever you need
            }
        }
    
        private static boolean isNumeric(String str) {
            try {
                Integer.parseInt(str);
                return true;
            } catch(NumberFormatException e){
                return false;
            }
        }
    }
    

    然后注册你的Converter:

    @Configuration
    public class MyConfig extends WebMvcConfigurationSupport {
       @Override
       public FormattingConversionService mvcConversionService() {
           FormattingConversionService f = super.mvcConversionService();
           f.addConverter(new MyCustomEnumConverter());
           return f;
       }
    }
    

    您可以改进MyCustomEnumConverter 的逻辑,但为了简单起见,我把它留在那里。

    如果您只想将特定的Converter 应用于一个控制器,请检查this answer

    【讨论】:

    • 感谢您的快速参考。当它到达控制器时,此设置是否会自动将我的 int 查询参数值转换为实际枚举,或者我是否需要使用任何 ConversionService 来手动进行转换?
    • 它应该自动执行此操作。只需使用 @RequestParam 注释和您的 enum 类型。
    • 我已启用此功能。它开始工作,但它在内部影响了其他几个地方。从 repo 获取数据时,我在其他一些实现中看到了这个问题 - “无法评估表达式方法抛出了 'org.hibernate.LazyInitializationException' 异常。”无法弄清楚这与我所做的更改有何关系。如果我禁用转换器的配置类,我没有看到异常! @Renis1235
    • 看看这个然后stackoverflow.com/questions/57536693/…。仅在您的一个控制器上使用转换器。但这两个错误消息彼此无关。试试看,如果有效就回复。
    • 成功了!非常感谢@Renis1235 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多