Skip to content

Commit 37574f7

Browse files
committed
BAEL-6118 Child object validation
1 parent 517ce6a commit 37574f7

File tree

4 files changed

+221
-0
lines changed

4 files changed

+221
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.baeldung.javaxval.childvalidation;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import jakarta.validation.Valid;
7+
import jakarta.validation.constraints.NotBlank;
8+
import jakarta.validation.constraints.Size;
9+
10+
public class Project {
11+
12+
@NotBlank(message = "Project title must be present")
13+
@Size(min = 3, max = 20, message = "Project title size not valid")
14+
private String title;
15+
16+
@Valid
17+
private User owner;
18+
19+
@Valid
20+
private List<Task> tasks;
21+
22+
private Map<@Valid User, @Valid Task> assignedTask;
23+
24+
private Map<String, List<@Valid Task>> taskByType;
25+
26+
public Project(String title) {
27+
this.title = title;
28+
}
29+
30+
public String getTitle() {
31+
return title;
32+
}
33+
34+
public void setTitle(String title) {
35+
this.title = title;
36+
}
37+
38+
public User getOwner() {
39+
return owner;
40+
}
41+
42+
public void setOwner(User owner) {
43+
this.owner = owner;
44+
}
45+
46+
public List<Task> getTasks() {
47+
return tasks;
48+
}
49+
50+
public void setTasks(List<Task> tasks) {
51+
this.tasks = tasks;
52+
}
53+
54+
public Map<User, Task> getAssignedTask() {
55+
return assignedTask;
56+
}
57+
58+
public void setAssignedTask(Map<User, Task> assignedTask) {
59+
this.assignedTask = assignedTask;
60+
}
61+
62+
public Map<String, List<Task>> getTaskByType() {
63+
return taskByType;
64+
}
65+
66+
public void setTaskByType(Map<String, List<Task>> taskByType) {
67+
this.taskByType = taskByType;
68+
}
69+
}
70+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.javaxval.childvalidation;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.Size;
5+
6+
public class Task {
7+
8+
@NotBlank(message = "Task title must be present")
9+
@Size(min = 3, max = 20, message = "Task title size not valid")
10+
private String title;
11+
12+
@Size(min = 3, max = 500, message = "Task description size not valid")
13+
private String description;
14+
15+
public Task(String title, String description) {
16+
this.title = title;
17+
this.description = description;
18+
}
19+
20+
public String getTitle() {
21+
return title;
22+
}
23+
24+
public void setTitle(String title) {
25+
this.title = title;
26+
}
27+
28+
public String getDescription() {
29+
return description;
30+
}
31+
32+
public void setDescription(String description) {
33+
this.description = description;
34+
}
35+
36+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.baeldung.javaxval.childvalidation;
2+
3+
import jakarta.validation.constraints.Email;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.Size;
6+
7+
public class User {
8+
9+
@NotBlank(message = "User name must be present")
10+
@Size(min = 3, max = 50, message = "User name size not valid")
11+
private String name;
12+
13+
@NotBlank(message = "User email must be present")
14+
@Email(message = "User email format is incorrect")
15+
private String email;
16+
17+
public User() {
18+
}
19+
20+
public User(String name, String email) {
21+
this.name = name;
22+
this.email = email;
23+
}
24+
25+
public String getName() {
26+
return name;
27+
}
28+
29+
public void setName(String name) {
30+
this.name = name;
31+
}
32+
33+
public String getEmail() {
34+
return email;
35+
}
36+
37+
public void setEmail(String email) {
38+
this.email = email;
39+
}
40+
41+
}
42+
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.baeldung.javaxval.childvalidation;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import java.util.Arrays;
7+
import java.util.HashMap;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.stream.Collectors;
11+
12+
import org.junit.jupiter.api.Test;
13+
14+
import jakarta.validation.ConstraintViolation;
15+
import jakarta.validation.Validation;
16+
import jakarta.validation.Validator;
17+
18+
public class ChildValidationUnitTest {
19+
20+
private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
21+
22+
@Test
23+
public void whenInvalidProjectAndUser_thenAssertConstraintViolations() {
24+
Project project = new Project(null);
25+
project.setOwner(new User(null, "invalid-email"));
26+
27+
List<String> messages = validate(project);
28+
29+
assertEquals(3, messages.size());
30+
assertTrue(messages.contains("Project title must be present"));
31+
assertTrue(messages.contains("User name must be present"));
32+
assertTrue(messages.contains("User email format is incorrect"));
33+
}
34+
35+
@Test
36+
public void whenCollectionsIsMap_thenAssertKeyIsValidated() {
37+
Map<User, Task> assignedTasks = new HashMap<>();
38+
assignedTasks.put(new User(), new Task(null, null));
39+
40+
Project project = new Project("Project name");
41+
project.setAssignedTask(assignedTasks);
42+
43+
List<String> messages = validate(project);
44+
45+
assertEquals(3, messages.size());
46+
assertTrue(messages.contains("Task title must be present"));
47+
assertTrue(messages.contains("User name must be present"));
48+
assertTrue(messages.contains("User email must be present"));
49+
}
50+
51+
@Test
52+
public void whenAnnotationOnTypeArgument_thenAssertValidated() {
53+
Map<String, List<Task>> groupedTasks = new HashMap<>();
54+
groupedTasks.put(null, Arrays.asList(new Task("Task1", null), new Task(null, "T2")));
55+
56+
Project project = new Project("Project name");
57+
project.setTaskByType(groupedTasks);
58+
59+
List<String> messages = validate(project);
60+
61+
assertEquals(2, messages.size());
62+
assertTrue(messages.contains("Task title must be present"));
63+
assertTrue(messages.contains("Task description size not valid"));
64+
}
65+
66+
private List<String> validate(Project project) {
67+
return validator.validate(project)
68+
.stream()
69+
.map(ConstraintViolation::getMessage)
70+
.collect(Collectors.toList());
71+
}
72+
73+
}

0 commit comments

Comments
 (0)