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



我有以下控制器:

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,而是接收camelCaseString。我需要将String转换为相应的enum。例如:

  • daily改为DAILY
  • weekly改为WEEKLY
  • monthly改为MONTHLY
  • 任何其他String应该成为null

我试过使用SpringConverter类,当enum在对象内部时不工作(至少我不知道如何使它在这样的时候工作)。

我真的不知道还能做什么

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

您需要的是为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;

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

相关内容

  • 没有找到相关文章

最新更新