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

spring在进入控制器之前将字符串解析为枚举

熊博远
2023-03-14

我有以下控制器:

public interface SaveController {
  @PostMapping(value = "/save")
  @ResponseStatus(code = HttpStatus.CREATED)
  void save(@RequestBody @Valid SaveRequest saveRequest);
}

saverequest对应于:

public class SaveRequest {
  @NotNull
  private SaveType type;

  private String name;
}

savetype:

public enum SaveType {
  DAILY, WEEKLY, MONTHLY;
}

控制器不接收枚举本身,而是一个camelCase字符串。我需要将字符串转换为相应的枚举。例如:

  • daily应变为daily
  • Weekly应变为Weekly
  • monthly应变为monthly
  • 任何其他字符串应变为

我试过使用spring的converter类,当enum在对象内部时,它就不起作用了(至少我不知道在这种情况下如何使它起作用)。

我真的不知道还能尝试什么

共有2个答案

贾沛
2023-03-14

您需要的是具有自定义批注和枚举的自定义验证类。

javax.validation库不内置对枚举的支持。

验证类

public class SaveTypeSubSetValidator implements ConstraintValidator<SaveTypeSubset, SaveType> {
    private SaveType[] subset;

    @Override
    public void initialize(SaveTypeSubset constraint) {
        this.subset = constraint.anyOf();
    }

    @Override
    public boolean isValid(SaveType value, ConstraintValidatorContext context) {
        return value == null || Arrays.asList(subset).contains(value);
    }
}

用于带有验证消息的验证注释的接口

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = SaveTypeSubSetValidator.class)
public @interface SaveTypeSubset {
    SaveType[] anyOf();
    String message() default "must be any of {anyOf}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

用法

@SaveTypeSubset(anyOf = {SaveType.NEW, SaveType.OLD})
private SaveType SaveType;

这是一种方法。本文还提到了更多的方法。

汲丰茂
2023-03-14

https://www.baeldung.com/jackson-serialize-enums这个站点可能会为您提供大量的选择。

最好的可能是这样的:

public enum SaveType {
    
    DAILY, WEEKLY, MONTHLY;

    @JsonCreator
    public static SaveType saveTypeforValue(String value) {
        return SaveType.valueOf(value.toUpperCase());    
    }
}
 类似资料:
  • 问题内容: 我编写角度控制器的风格是这样的(使用控制器名称而不是函数) 我现在需要的是提供我要定义解析部分的路线时: 由于控制器定义为名称,如何解决以下问题? 为了更详细地阐明,我想在解析路由之前从服务器加载一些数据,然后在控制器中使用这些数据。 更新: 更准确地说,我希望每个模块都有其“解析”功能,该功能将在执行具有该控制器的root用户之前被调用。这篇文章中的解决方案(由MiskoHevery

  • 控制字符序列以'\为前缀,以\\结尾。在控制序列中有两个数字,它们指定控制字符。 在上面的示例中,结果字符串为 ESC代表不可打印的ASCII转义字符。 输入'a string'\ctrl\''会产生错误 你知道吗?顺便说一句:我们使用的是antlr V4.5。

  • 问题内容: 我要提取长十六进制字符串形式的数据,我需要将其转换为十进制表示法,截断18个小数位,然后在JSON中使用。 例如,我可能具有十六进制字符串: 最初我尝试使用,但是由于它支持的最高级别,我的数量最终太大了。 转换和截断后的示例为10 ^ 6。但是,在某些情况下,此数字最多可以为10 ^ 12(意味着截断为10 ^ 30!)。 攻击此问题的最佳策略是什么? 问题答案: 使用math / b

  • 有人能告诉我为什么这段代码会引发异常吗? 此代码引发以下异常: 我使用以下JDK在Windows 7上运行

  • 考虑一下,我得到了以下枚举类: 我想指定ostream操作符( 并获得以下输出,这是Foo。 我的问题是: 是否有存储枚举“名称说明符”的地方?(即,对于枚举类TestEnum,它是None、Foo和Bar),因此我可以编写一个函数(或者至多是函数模板)来指定TestEnum的ostream操作符,例如: 到目前为止,我是这样做的: 我见过一些使用库的解决方案,但这次我不希望使用它。

  • 编者按:此代码示例来自Rust 1.0之前的版本,并且在语法上是无效的Rust 1.0代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。 肯定有更好的方法将二进制字符串转换为十六进制字符串比这? 这样做的结果是 我用的是Rustc0.12。夜间