我有以下控制器:
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;
这是一种方法。本文还提到了更多的方法。