如何配置Spring仅在id非空时执行其自定义数字校验?
实现仅当id不为null时执行数字校验的方案
有两种简洁的实现方式可以满足你的需求:
方法一:修改自定义校验器逻辑
直接在IsNumberValidatorConstraint对应的校验器类中增加null值判断,当id为null时直接返回校验通过,仅在id不为null时执行数字校验逻辑。
示例代码:
public class IsNumberValidatorConstraintValidator implements ConstraintValidator<IsNumberValidatorConstraint, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { // id为null时直接通过校验 if (value == null) { return true; } // 原有的数字校验逻辑 try { Long.parseLong(value); return true; } catch (NumberFormatException e) { return false; } } }
这种方式无需修改实体类注解,仅调整校验器逻辑即可实现需求,兼容性最好。
方法二:使用Spring Validation的@IfPresent注解(Spring Boot 2.3+)
如果你的项目使用Spring Boot 2.3及以上版本,可以借助@IfPresent注解实现条件校验,该注解会让后续的校验仅在字段不为null时生效。
修改ProjectSearchCriteria类:
@Data @Builder public class ProjectSearchCriteria { @IfPresent @IsNumberValidatorConstraint(message = "invalid input for id") private String id; private String projectName; }
通用注意事项
无论使用哪种方法,都需要确保在Controller的请求参数上添加@Valid或@Validated注解,触发Spring的校验机制:
@GetMapping("/api/projects") public ResponseEntity<List<Project>> searchProjects(@Valid ProjectSearchCriteria criteria) { // 执行搜索逻辑 return ResponseEntity.ok(projectService.search(criteria)); }
内容的提问来源于stack exchange,提问作者Shanka Somasiri
相关产品推荐
相关产品推荐

