为何@NotBlank对首尾含空格的字符串不生效?如何校验避免首尾空格?
解决Java字段首尾空格的校验问题
你遇到的问题核心在于@NotBlank的校验逻辑并非禁止首尾空格——它仅判断字符串不为null,且调用trim()后的长度大于0。所以像" abc xyz 123 "这类首尾带空格但中间有有效内容的字符串,@NotBlank会判定为合法。要实现禁止首尾出现空格的校验,可以用以下两种方案:
方案1:使用@Pattern正则快速实现
直接通过正则表达式约束字符串的首尾字符,结合已有注解使用即可:
@NotNull(message = "Not null") @NotBlank(message = "Not blank") @Pattern(regexp = "^\\S.*\\S$|^\\S$", message = "不能以空格开头或结尾") @Size(min = 10, max = 300, message = "min 10, max 300 characters") private String title;
正则逻辑说明:
^\\S:强制字符串开头为非空格字符.*:允许中间包含任意字符(含空格)\\S$:强制字符串结尾为非空格字符|^\\S$:兼容单个非空格字符的场景,避免长度为1时校验失败
方案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) { // 空值校验交给@NotNull、@NotBlank处理,这里只校验非空字符串的首尾 if (value == null || value.isEmpty()) { return true; } return !value.startsWith(" ") && !value.endsWith(" "); } }
3. 在字段上使用自定义注解
@NotNull(message = "Not null") @NotBlank(message = "Not blank") @NoLeadingTrailingWhitespace(message = "不能以空格开头或结尾") @Size(min = 10, max = 300, message = "min 10, max 300 characters") private String title;
内容的提问来源于stack exchange,提问作者NqanVo
相关产品推荐
相关产品推荐

