You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:02:17