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

zlwx9yxi  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(241)

我有以下控制器:

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;
}

控制器未接收到 `enum` 它本身,不过是个 Camel 箱 `String` . 我需要把它转换成 `String` 进入相应的 `enum` . 例如: `daily` 应该变成 `DAILY` . `weekly` 应该变成 `WEEKLY` . `monthly` 应该变成 `MONTHLY` .
还有别的吗 `String` 应该变成 `null` .
我试过用Spring `Converter` 类,当 `enum` 是在一个物体里面(至少我不知道如何在这种时候使它工作)。
我真的不知道还能尝试什么
jgwigjjp

jgwigjjp1#

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());    
    }
}
p8ekf7hl

p8ekf7hl2#

您需要的是为enum提供带有自定义验证类的自定义注解。 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;

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

相关问题