有没有机会验证请求体中DTO对象的所有值是否都为null?

huangapple 未分类评论46阅读模式
英文:

Is there any chance to validate all the values of the DTO Object is null in Request Body

问题

@Controller......

@PutMapping(value = "/{id}")
public ResponseEntity<JsonNode> editStudent(@PathVariable @Positive(message = "Student id must be Positive Value") Long id, @Valid @ValidRequestBody(DTOClass = StudentDTO.class) @Validated(value = Update.class) @RequestBody(required = true) StudentDTO studentDTO, BindingResult bindingResult) {.....

----------------------------------------------------------------------------

@Documented
@Retention(RUNTIME)
@Target({ TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.MODULE, ElementType.PACKAGE, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE })
@Constraint(validatedBy = RequestBodyValidator.class)
public @interface ValidRequestBody {

    String message() default "Required parameter is missing";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    Class<?> DTOClass();
}

-----------------------------------------------------

public class RequestBodyValidator implements ConstraintValidator<ValidRequestBody, Map<String, Object>> {

    Class<?> dtoClass = null;

    @Override
    public void initialize(ValidRequestBody constraintAnnotation) {

        this.dtoClass = constraintAnnotation.DTOClass();
    }

    @Override
    public boolean isValid(Map<String, Object> objectNode, ConstraintValidatorContext context) {

        Collection<Object> objectValues = objectNode.values();

        return !objectValues.stream().allMatch(null);
    }
}
英文:
@Controller......

@PutMapping(value = &quot;/{id}&quot;)
    public ResponseEntity&lt;JsonNode&gt; editStudent( @PathVariable @Positive(message = &quot;Student id must be Positive Value&quot;) Long id, @Valid @ValidRequestBody(DTOClass = StudentDTO.class) @Validated(value = Update.class) @RequestBody(required = true) StudentDTO studentDTO, BindingResult bindingResult ) {.....

----------------------------------------------------------------------------

@Documented
@Retention(RUNTIME)
@Target({ TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.MODULE, ElementType.PACKAGE, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE })
@Constraint(validatedBy = RequestBodyValidator.class)
public @interface ValidRequestBody {

    String message()

    default &quot;Required parameter is missing&quot;;

    Class&lt;?&gt;[] groups() default {};

    Class&lt;? extends Payload&gt;[] payload() default {};

    Class&lt;?&gt; DTOClass();
}

-----------------------------------------------------

public class RequestBodyValidator implements ConstraintValidator&lt;ValidRequestBody, Map&lt;String, Object&gt;&gt; {

    Class&lt;?&gt; dtoClass = null;

    @Override
    public void initialize( ValidRequestBody constraintAnnotation ) {

        this.dtoClass = constraintAnnotation.DTOClass();
    }

    @Override
    public boolean isValid( Map&lt;String, Object&gt; objectNode, ConstraintValidatorContext context ) {

        Collection&lt;Object&gt; objectValues = objectNode.values();

        return !objectValues.stream().allMatch( null );
    }
}

答案1

得分: -1

你可以在DTO的所有字段上使用@Valid或@NonNull注解。因此,如果一个字段接收到null或空值,将会抛出异常。

英文:

You can use @Valid or @NonNull annotation on all fields in your DTO. So, if a field is received as null or empty, exception would be thrown.

huangapple
  • 本文由 发表于 2020年7月24日 01:22:53
  • 转载请务必保留本文链接:https://java.coder-hub.com/63059820.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定