嗨,请分两步找到我的答案,首先是正确的,然后是建议的实施方式。
更正:
请ObjectUtils.isEmpty(arg)
用于检查字符串是否为 0 长度或 null。这是您的代码的修改版本
public interface ZipcodeService {
void validate(@Zipcode String zipCode) throws ZipCodeValidationException;
}
@Service
public static class ZipcodeServiceImpl implements ZipcodeService {
private final ZipCodeRegexMatcher zipCodeRegexMatcher;
public ZipcodeServiceImpl() {
zipCodeRegexMatcher = new ZipCodeRegexMatcher();
}
@Override
public void validate(String zipCode) throws ZipCodeValidationException {
// uncomment for Regex Validation
// boolean valid = zipCodeRegexMatcher.isValid(zipCode);
// uncomment for Simple text validation
final boolean valid = !ObjectUtils.isEmpty(zipCode);
if (!valid) {
throw new ZipCodeValidationException("Invalid zipcode");
}
}
}
这就是调用者的样子Controller
@GetMapping(path = "dummy")
public String getDummy(@RequestParam("zipcode") String zipCode) {
try {
zipcodeService.validate(zipCode);
return zipCode;
} catch (ZipCodeValidationException e) {
return e.getMessage();
}
}
建议方式:
添加以下条目pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
创建注释和验证器,如下所示
@Constraint(validatedBy = {ZipcodeValidator.class})
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Zipcode {
String message() default "Invalid Zipcode value";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public static class ZipcodeValidator implements ConstraintValidator<Zipcode, String> {
private final ZipCodeRegexMatcher zipCodeRegexMatcher;
public ZipcodeValidator() {
zipCodeRegexMatcher = new ZipCodeRegexMatcher();
}
@Override
public boolean isValid(String zipCode, ConstraintValidatorContext constraintValidatorContext) {
return zipCodeRegexMatcher.isValid(zipCode);
}
}
完成此设置后,使用@Validated转到控制器类和带注释的类,
以及您希望使用自定义注释进行验证的字段,即Zipcode
我们刚刚创建的。在这种情况下,我们通过扩展ConstraintValidator创建一个自定义验证器 ZipcodeValidator 。
这是调用者的样子:
@GetMapping
public String get(@Zipcode @RequestParam("zipcode") String zipCode) {
return zipCode;
}
在验证失败时,它会抛出javax.validation.ConstraintViolationException: get.zipCode: Invalid Zipcode value
您可以根据需要使用ControllerAdvice自定义的内容。
您还可以@Zipcode
在服务级别使用注释,它的工作方式相同。关于ZipCodeRegexMatcher
而不是在构造函数中创建它,您可以创建一个 bean 并注入该依赖项。它是一个简单的类,具有邮政编码的正则表达式并执行验证。
public static class ZipCodeRegexMatcher {
public static final String ZIP_REGEX = "^[0-9]{5}(?:-[0-9]{4})?$";
private final Pattern pattern;
public ZipCodeRegexMatcher() {
pattern = Pattern.compile(ZIP_REGEX);
}
public boolean isValid(String zipCode) {
return pattern.matcher(zipCode).matches();
}
}
整个代码位于此处