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

我需要验证我的 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();

  }



素胚勾勒不出你
浏览 105回答 1
1回答

慕少森

要应用验证,您需要使用 @Valid annotaion。您必须缺少 @Valid 这就是您的验证不起作用的原因。稍后还有一个问题。在您的 DTO WidgetTypeAddOrUpdateDTO 中,枚举值持有者变量是 IsActive 类型,它是一个枚举。当 spring 将从 JSON 填充/反序列化 DTO 时,如果枚举值无效,它将抛出异常,因此您需要将其更改为 String 类型。一旦将其更改为 String,则 string 可以包含任何文本,但您的验证将受到限制,如果存在无效值,则会产生验证错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java