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

如何在Request estParm中将多个值转换为枚举?

李和裕
2023-03-14

我有下面的枚举声明

public enum FamilyType {
    FIRSTNAME("firstname"),
    LASTNAME("lastname");

    private final String type;

    FamilyType(String type) {
        this.type = type;
    }

    public static FamilyType fromString(String type) {
        for (FamilyType t : FamilyType.values()) {
            if (t.type.equals(type)) {
                return t;
            }
        }
        return converter(type);
    }

    @Deprecated
    private static FamilyType converter(String value) {
        if ("NICKNAME".equalsIgnoreCase(value)) {
            return FIRSTNAME;
        }
        if ("SURENAME".equalsIgnoreCase(value)) {
            return LASTNAME;
        }

        throw new InvalidFileNameException("my-enum", value);
    }
}

我有一个控制器endpoint,其中删除请求将FamilyType保存为Request estparam,如下所示

public String deleteFamilyType(@PathVariable String userId, @Valid @RequestParam FamilyType familyType) {

从邮递员发送时,familytype=firstname有效,但如果发送familytype=昵称,则我的转换器返回

org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:
Failed to convert value of type 'java.lang.String' to required type 'FamilyType';
nested exception is java.lang.IllegalArgumentException: 
No enum constant FamilyType.NICKNAME
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:133)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.

共有1个答案

邓赤岩
2023-03-14

在本教程第3节之后,我们可以使用自定义转换器覆盖默认的转换。

public class StringToFamilyTypeConverter implements Converter<String, FamilyType> {
    @Override
    public FamilyType convert(String source) {
        if ("NICKNAME".equalsIgnoreCase(source)) {
            return FamilyType.FIRSTNAME;
        }
        if ("SURENAME".equalsIgnoreCase(source)) {
            return FamilyType.LASTNAME;
        }
        return FamilyType.valueOf(source.toUpperCase());
    }
}

然后将转换器添加到MVC配置中

@Configuration
public class AppConfig implements WebMvcConfigurer {
    // ...
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToFamilyTypeConverter());
    }
    // ...
}
 类似资料:
  • 问题内容: 我有一个返回int类型的函数。但是,我只有TAX枚举的值。 如何将TAX枚举值转换为整数? 问题答案: 您需要以某种方式使枚举公开,例如 (顺便说一句,我将名称更改为更常规和易读。) 这是 假设 您要在构造函数中分配值。如果这不是您想要的,则需要向我们提供更多信息。

  • 问题内容: 我有一个第三方图书馆给我一个图书馆。我想像Java 8那样懒惰地使用该枚举,并调用诸如此类的东西。 有没有现成的图书馆?我已经在引用Guava和Apache Commons,所以如果其中任何一个都有理想的解决方案。 另外,在保留所有内容的懒惰性质的同时将a 变成最佳/最简单的方法是什么? 问题答案: 这个答案已经提供了一个解决方案,可以解决以下问题: 应当强调的是,由此而来 的 懒任何

  • 问题内容: 我有一些Java代码,我想将其翻译为C#。srcParams是一个哈希表。 这是Java代码: 这是我在C#中的尝试 你能告诉我是否正确吗? 问题答案: 您所拥有的几乎可以了,只需重命名变量并添加的使用即可:

  • 我有一个第三方库,它给我一个。我希望将该枚举作为Java8来使用,在其上调用诸如、和之类的东西。 是否有一个现有的库中包含此内容?我已经引用了Guava和Apache Commons,所以如果其中任何一个都有理想的解决方案。 或者,将转换为同时保留所有内容的惰性的最佳/最简单的方法是什么?

  • 我在TypeScript中定义了以下枚举: 现在在我的函数中,我接收颜色作为字符串。我已经尝试了以下代码: 如何将该值转换为枚举?

  • 问题内容: 鉴于以下枚举: 如何从下面的常量获取字符串? 问题答案: 不确定此功能是在哪个Swift版本中添加的,但是现在( Swift 2.1 )您只需要以下代码: 如果将字符串用于原始值,则每种情况的隐式值都是该 情况名称 的 文本 。 […] 在上面的示例中,CompassPoint.south的隐式原始值为“ south”,依此类推。 您可以使用其rawValue属性访问枚举用例的原始值: