Why @NotEmpty Misses Blank Strings and How @NotBlank Fixes It

The article explains why using @NotEmpty fails to detect blank strings, demonstrates the issue with a simple demo, shows the correct use of StringUtils.isBlank, and clarifies the differences between @NotNull, @NotEmpty, and @NotBlank annotations in Java validation.

macrozheng
macrozheng
macrozheng
Why @NotEmpty Misses Blank Strings and How @NotBlank Fixes It

Introduction

A bug was reported where a source field passed as an empty string could still be updated successfully, prompting a suggestion to add validation.

@NotEmpty(message = "source must not be empty")
private String source;

The @NotEmpty annotation appears to behave like StringUtils.isEmpty, but examining the source reveals it is used incorrectly.

public static boolean isEmpty(CharSequence cs) {
    return cs == null || cs.length() == 0;
}

When a blank string (length > 0) is passed, @NotEmpty cannot detect the problem.

1. Reproduce Demo

String source = "  ";
System.out.println(StringUtils.isEmpty(source));
System.out.println(source.length());
false
2
Because isEmpty checks that the value is not null and that its length is greater than 0; a blank string has length > 0, so the method returns false.

2. Correct Validation

To validate blank strings correctly, use StringUtils.isBlank, which checks for null, empty, or whitespace‑only strings.

String source = "  ";
System.out.println(StringUtils.isBlank(source));
true

The source code of isBlank is:

public static boolean isBlank(CharSequence cs) {
    int strLen = length(cs);
    if (strLen == 0) {
        return true;
    } else {
        for (int i = 0; i < strLen; ++i) {
            if (!Character.isWhitespace(cs.charAt(i))) {
                return false;
            }
        }
        return true;
    }
}

Note the use of Character.isWhitespace to detect whitespace characters.

3. Differences Among @NotNull, @NotEmpty, and @NotBlank

@NotNull : the value cannot be null, but empty strings or empty collections are allowed.

@NotEmpty : the value cannot be null; empty strings are allowed only if the length is greater than 0 (i.e., the string must contain at least one character).

@NotBlank : the value cannot be null and cannot be a blank string (null, empty, or whitespace‑only).

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

JavaspringvalidationStringUtils
macrozheng
Written by

macrozheng

Dedicated to Java tech sharing and dissecting top open-source projects. Topics include Spring Boot, Spring Cloud, Docker, Kubernetes and more. Author’s GitHub project “mall” has 50K+ stars.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.