Spring Boot:POST请求字符串字段首尾空格校验报错需求及问题
字符串首尾空格校验方案(替代@NotBlank)
@NotBlank注解仅会校验字符串非null且trim后长度大于0,无法阻止字段本身存在首尾空格(比如" test "会被@NotBlank放行)。以下是两种可行的解决方式:
1. 快速实现:使用@Pattern正则校验
直接通过正则表达式限制字符串首尾不能有空格,中间允许包含空格。在实体类字段上添加注解:
import javax.validation.constraints.Pattern; public class UserRequest { @Pattern( regexp = "^(?!\\s).*(?<!\\s)$", message = "用户名不能包含首尾空格" ) private String username; // 其他字段... }
正则说明:
^(?!\\s):正向否定预查,确保字符串开头不是空格(?<!\\s)$:反向否定预查,确保字符串结尾不是空格
如果需要同时校验字段非空,可搭配@NotBlank使用。
2. 复用性方案:自定义校验注解
如果多个字段需要相同的首尾空格校验,自定义注解更便于维护:
步骤1:定义自定义注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Constraint(validatedBy = NoLeadingTrailingWhitespaceValidator.class) @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface NoLeadingTrailingWhitespace { String message() default "字段不能包含首尾空格"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
步骤2:实现校验逻辑
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class NoLeadingTrailingWhitespaceValidator implements ConstraintValidator<NoLeadingTrailingWhitespace, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 若允许空值,此处返回true;需非空则搭配@NotBlank if (value == null || value.isEmpty()) { return true; } return !value.startsWith(" ") && !value.endsWith(" "); } }
步骤3:在字段上使用
import javax.validation.constraints.NotBlank; public class UserRequest { @NoLeadingTrailingWhitespace(message = "用户名不能有首尾空格") @NotBlank(message = "用户名不能为空") private String username; // 其他字段... }
注意事项
确保Spring Boot项目中已引入spring-boot-starter-validation依赖,否则校验注解无法生效:
<!-- Maven 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者David Montero Crespo
相关产品推荐
相关产品推荐

