Skip to content

Commit 1f6f1e2

Browse files
Faron Duttonodrotbohm
Faron Dutton
authored andcommitted
#1757 - Add support for javax.validation.constraints.NotBlank.
The presence of @nonblank on a representation model's property now causes it to be considered required. It will also cause a default pattern exposed that allows clients to validate input values. Fixes #1757.
1 parent c501fa2 commit 1f6f1e2

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import javax.validation.constraints.Email;
3232
import javax.validation.constraints.Max;
3333
import javax.validation.constraints.Min;
34+
import javax.validation.constraints.NotBlank;
3435
import javax.validation.constraints.NotNull;
3536
import javax.validation.constraints.Pattern;
3637

@@ -68,6 +69,8 @@
6869
*/
6970
public class PropertyUtils {
7071

72+
static final String NOT_BLANK_REGEX = "^\\s*(\\S+\\s*)+$";
73+
7174
private static final Map<ResolvableType, ResolvableType> DOMAIN_TYPE_CACHE = new ConcurrentReferenceHashMap<>();
7275
private static final Map<ResolvableType, InputPayloadMetadata> METADATA_CACHE = new ConcurrentReferenceHashMap<>();
7376
private static final Set<String> FIELDS_TO_IGNORE = new HashSet<>(Arrays.asList("class", "links"));
@@ -601,7 +604,10 @@ private Jsr303AwarePropertyMetadata(AnnotatedProperty property) {
601604
*/
602605
@Override
603606
public boolean isRequired() {
604-
return super.isRequired() || property.getAnnotation(NotNull.class).isPresent();
607+
608+
return super.isRequired() //
609+
|| property.getAnnotation(NotNull.class).isPresent() //
610+
|| property.getAnnotation(NotBlank.class).isPresent();
605611
}
606612

607613
/*
@@ -610,7 +616,14 @@ public boolean isRequired() {
610616
*/
611617
@Override
612618
public Optional<String> getPattern() {
613-
return getAnnotationAttribute(Pattern.class, "regexp", String.class);
619+
620+
Optional<String> attribute = getAnnotationAttribute(Pattern.class, "regexp", String.class);
621+
622+
if (!attribute.isPresent() && property.getAnnotation(NotBlank.class).isPresent()) {
623+
attribute = Optional.of(NOT_BLANK_REGEX);
624+
}
625+
626+
return attribute;
614627
}
615628

616629
/*

src/test/java/org/springframework/hateoas/mediatype/PropertyUtilsTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.stream.Stream;
3232

3333
import javax.validation.constraints.Email;
34+
import javax.validation.constraints.NotBlank;
3435
import javax.validation.constraints.NotNull;
3536
import javax.validation.constraints.Pattern;
3637

@@ -158,10 +159,20 @@ void considersJsr303Annotations() {
158159
assertThat(it.isRequired()).isTrue();
159160
});
160161

162+
assertThat(getProperty(metadata, "nonBlank")).hasValueSatisfying(it -> {
163+
assertThat(it.isRequired()).isTrue();
164+
assertThat(it.getPattern()).hasValue(PropertyUtils.NOT_BLANK_REGEX);
165+
});
166+
161167
assertThat(getProperty(metadata, "pattern")).hasValueSatisfying(it -> {
162168
assertThat(it.getPattern()).hasValue("\\w");
163169
});
164170

171+
assertThat(getProperty(metadata, "nonBlankPattern")).hasValueSatisfying(it -> {
172+
assertThat(it.isRequired()).isTrue();
173+
assertThat(it.getPattern()).hasValue("\\w");
174+
});
175+
165176
assertThat(getProperty(metadata, "annotated")).hasValueSatisfying(it -> {
166177
assertThat(it.getPattern()).hasValue("regex");
167178
});
@@ -250,7 +261,9 @@ static class EmployeeWithNullReturningGetter {
250261
static class Jsr303SamplePayload {
251262

252263
@NotNull String nonNull;
264+
@NotBlank String nonBlank;
253265
@Pattern(regexp = "\\w") String pattern;
266+
@NotBlank @Pattern(regexp = "\\w") String nonBlankPattern;
254267
TypeAnnotated annotated;
255268
}
256269

0 commit comments

Comments
 (0)