我在弹簧控制器中使用验证器。如果需要@RequestParam
没问题,我可以使用@NotBlank
检查String。但是,如果@RequestParam
是可选的,则我不能将其与@NotBlank
一起使用,因为此参数是可选的,有时可以为null。
如果String不为null,我想验证@NotBlank
。有什么约束可以帮助我吗?
@RequestParam @NotBlank String name
完美运行。我对required=false
有疑问
如果客户端不发送可选的description参数,则验证失败。
@PatchMapping("/role/{id}")
public ResponseEntity<?> updateRole(HttpServletRequest request, @PathVariable @Positive Integer id,
@RequestParam @NotBlank String name,
@RequestParam(required = false) @NotBlank String description)
如果描述不是@NotBlank
,我想验证null
。
`@RequestParam(required = false) @NotBlank String description`
如果我这样使用,我会得到“输入验证失败!”。
答案 0 :(得分:0)
这不是验证@RequestParam的正确方法。您必须在代码中进行验证
如果为空,则throw new IllegalArgumentException("{\"error\":\"The parameter is invalid\"}"
答案 1 :(得分:0)
您可能需要为此添加自定义验证器
示例实施
界面
@Documented
@Constraint(validatedBy = YourValidator.class)
@Target({ ElementType.METHOD,ElementType.ANNOTATION_TYPE,ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface NotBlankIfPresent{
String message() default "Error MEssage";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
您的验证者类
public class YourValidator implements ConstraintValidator<NotBlankIfPresent, String> {
@Override
public boolean isValid(String object, ConstraintValidatorContext context) {
//Your Logic
}
}
希望这会有所帮助
答案 2 :(得分:0)
同时使用@RequestParam(required = false)
和@NotBlank
毫无意义。
@NotBlank
批注的工作原理如下。
以@NotBlank约束的String字段不能为null,并且修剪后的长度必须大于零。
可能的解决方法是,只要您有required = false
示例:
@PatchMapping("/role/{id}")
public ResponseEntity<?> updateRole(HttpServletRequest request, @PathVariable
@Positive Integer id, @RequestParam @NotBlank String name,
@RequestParam(required = false, defaultValue = "adefaultvalue") @NotBlank String description) {
if(description.equals("adefaultvalue") {
// that means that the user did not send any value for this variable so you can
// add your validation logic here
}
}
请记住,上面的代码尚未经过测试