20

How can we ensure the individual strings inside a list are not null/blank or follow a specific pattern

@NotNull
List<String> emailIds;

I also want to add a pattern

@Pattern("\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b.")

but I can live without it.But I would definitely like to have a constraint which will check if any strings inside a list are null or blank. Also how would the Json schema look like

"ids": {
      "description": "The  ids associated with this.", 
    "type": "array",
        "minItems": 1,
        "items": {
        "type": "string",
         "required" :true }
 }

"required" :true does not seem to do the job
Vikrant Kashyap
  • 6,398
  • 3
  • 32
  • 52
Abhijeet Kushe
  • 2,477
  • 3
  • 26
  • 39
  • 1
    Why not create an Object rather than String, and enforce the pattern within the object creation. Say, List eMailIds; Class EMailInfo (String emailid) .. check for valid, return null if bad; and use method get emailIds in that class – ErstwhileIII Mar 06 '14 at 19:01
  • 1
    Create a derived class of List, whose add() method override does all that? – Mark W Mar 06 '14 at 19:01
  • 1
    Check this http://stackoverflow.com/questions/4308224/hibernate-validation-of-collections-of-primitives – Guy Bouallet Mar 06 '14 at 19:09

4 Answers4

59

Bean validation 2.0 (Hibernate Validator 6.0.1 and above) supports validating container elements by annotating type arguments of parameterized types. Example:

List<@Positive Integer> positiveNumbers;

Or even (although a bit busy):

List<@NotNull @Pattern(regexp="\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\\b") String> emails;

References:

Brice Roncace
  • 10,110
  • 9
  • 60
  • 69
12

You can create a simple wrapper class for the e-mail String:

public class EmailAddress {

    @Pattern("\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b.")
    String email;

    //getters and setters
}

Then mark the field @Valid in your existing object:

@NotNull
@Valid
List<EmailAddress> emailIds;

The validator will then validate each object in the list.

ach
  • 6,164
  • 1
  • 25
  • 28
9

You don’t have to use any wrapper class just to validate a list of strings. Just use @EachPattern constraint from validator-collection:

@NotNull
@EachPattern(regexp="\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b.")
List<String> values;

And that’s all. Easy, right? See this SO answer for more information.

Community
  • 1
  • 1
Jakub Jirutka
  • 10,269
  • 4
  • 42
  • 35
0

In my opinion, use a wrapper class for the object, and have your own verification on the methods:

public class ListWrapper<E> {

    private List<E> list = new ArrayList<>();
    private Pattern check = /*pattern*/;

    public boolean add(E obj) {
        if (this.verify(obj)) {
            return list.add(obj);
        }
        return false;
    }

    //etc

    public boolean verify(E obj) {
        //check pattern and for null
    }

Alternatively, just use a custom object for the list

Rogue
  • 11,105
  • 5
  • 45
  • 71