为了账号安全,请及时绑定邮箱和手机立即绑定

在 spring 引导服务中自定义约束验证器之前,Json 消息解析失败

在 spring 引导服务中自定义约束验证器之前,Json 消息解析失败

素胚勾勒不出你 2023-04-13 15:28:14
我需要验证我的 DTO bean 将枚举作为一个字段,为了达到相同的目的,我遵循了此处提供的一些解决方案,但 json 反序列化甚至在到达我的自定义验证器之前就失败了。其他开发人员在此处提供的解决方案。import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.*;@Documented@Constraint(validatedBy = {EnumValueValidator.class})@Retention(RetentionPolicy.RUNTIME)@Target({  ElementType.ANNOTATION_TYPE,  ElementType.CONSTRUCTOR,  ElementType.FIELD,  ElementType.METHOD,  ElementType.PARAMETER})public @interface EnumValue {  public abstract String message() default "{validation.enum.message}";  public abstract Class<?>[] groups() default {};  public abstract Class<? extends Payload>[] payload() default {};  public abstract Class<? extends java.lang.Enum<?>> enumClass();}import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> {  private Object[] enumValues;  @Override  public void initialize(final EnumValue annotation) {    enumValues = annotation.enumClass().getEnumConstants();  }  @Override  public boolean isValid(final Object value, final ConstraintValidatorContext context) {    if (null != value) {      String contextValue = value.toString();      for (Object enumValue : enumValues) {        if (enumValue.toString().equals(contextValue)) {          return true;        }      }    }    return false;  }}并在我的 WidgetTypeAddOrUpdateDTO 上使用它作为@EnumValue(enumClass = IsActive.class, message = "Only ACTIVE and NOT_ACTIVE accepted.")  private IsActive isActive;我在控制器中的请求方法是这样的: @PostMapping("/widget/type")  public ResponseEntity<String> addWidgetTypes(      @Validated @RequestBody ValidatorList<WidgetTypeAddOrUpdateDTO> widgetTypeDTOs) {    widgetTypeService.add(widgetTypeDTOs.getValidatedList());    return ResponseEntity.created(URI.create("/dashboard/admin/widget/type")).build();  }
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

要应用验证,您需要使用 @Valid annotaion。您必须缺少 @Valid 这就是您的验证不起作用的原因。

稍后还有一个问题。在您的 DTO WidgetTypeAddOrUpdateDTO 中,枚举值持有者变量是 IsActive 类型,它是一个枚举。当 spring 将从 JSON 填充/反序列化 DTO 时,如果枚举值无效,它将抛出异常,因此您需要将其更改为 String 类型。一旦将其更改为 String,则 string 可以包含任何文本,但您的验证将受到限制,如果存在无效值,则会产生验证错误。


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信