Skip to content

Commit 06eb67e

Browse files
basic implementation for MVC
1 parent 8d71495 commit 06eb67e

14 files changed

Lines changed: 186 additions & 8 deletions

File tree

jooby/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,6 @@
4949
<artifactId>jakarta.inject-api</artifactId>
5050
</dependency>
5151

52-
<!-- jakarta.validation -->
53-
<dependency>
54-
<groupId>jakarta.validation</groupId>
55-
<artifactId>jakarta.validation-api</artifactId>
56-
</dependency>
57-
5852
<!-- config -->
5953
<dependency>
6054
<groupId>com.typesafe</groupId>

modules/jooby-apt/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@
1919

2020
<dependencies>
2121

22+
<dependency>
23+
<groupId>io.jooby</groupId>
24+
<artifactId>jooby-validation</artifactId>
25+
<version>${jooby.version}</version>
26+
</dependency>
27+
2228
<dependency>
2329
<groupId>io.jooby</groupId>
2430
<artifactId>jooby</artifactId>

modules/jooby-apt/src/main/java/io/jooby/internal/apt/MvcParameter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ public class MvcParameter {
2222
private final VariableElement parameter;
2323
private final Map<String, AnnotationMirror> annotations;
2424
private final TypeDefinition type;
25+
private final boolean requireBeanValidation;
2526

2627
public MvcParameter(MvcContext context, MvcRoute route, VariableElement parameter) {
2728
this.route = route;
2829
this.parameter = parameter;
2930
this.annotations = annotationMap(parameter);
3031
this.type =
3132
new TypeDefinition(context.getProcessingEnvironment().getTypeUtils(), parameter.asType());
33+
this.requireBeanValidation = annotations.get("jakarta.validation.Valid") != null;
3234
}
3335

3436
public TypeDefinition getType() {
@@ -144,4 +146,8 @@ private Map<String, AnnotationMirror> annotationMap(VariableElement parameter) {
144146
private List<? extends AnnotationMirror> annotationFromAnnotationType(Element element) {
145147
return Optional.ofNullable(element.getAnnotationMirrors()).orElse(Collections.emptyList());
146148
}
149+
150+
public boolean isRequireBeanValidation() {
151+
return requireBeanValidation;
152+
}
147153
}

modules/jooby-apt/src/main/java/io/jooby/internal/apt/MvcRoute.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,16 @@ public List<String> generateHandlerCall(boolean kt) {
203203
/* Parameters */
204204
var paramList = new StringJoiner(", ", "(", ")");
205205
for (var parameter : getParameters(true)) {
206-
paramList.add(parameter.generateMapping(kt));
206+
String generatedParameter = parameter.generateMapping(kt);
207+
if (parameter.isRequireBeanValidation()) {
208+
generatedParameter = CodeBlock.of(
209+
"io.jooby.validation.ValidationHelper.validate(",
210+
"ctx, ",
211+
generatedParameter,
212+
")");
213+
}
214+
215+
paramList.add(generatedParameter);
207216
}
208217
var throwsException = !method.getThrownTypes().isEmpty();
209218
var returnTypeGenerics =
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package tests.validation;
2+
3+
class Bean {
4+
private String name;
5+
6+
public String getName() {
7+
return name;
8+
}
9+
10+
public void setName(String name) {
11+
this.name = name;
12+
}
13+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package tests.validation;
2+
3+
import io.jooby.apt.ProcessorRunner;
4+
import org.junit.jupiter.api.Test;
5+
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
8+
public class BeanValidationGeneratorTest {
9+
10+
@Test
11+
public void generate_validation_forBean() throws Exception {
12+
new ProcessorRunner(new BeanValidationsController()).withSource(
13+
false,
14+
source -> {
15+
assertTrue(source.contains(
16+
"c.validateQueryBean(io.jooby.validation.ValidationHelper.validate(ctx, ctx.query(\"bean\").isMissing() ? ctx.query().toNullable(tests.validation.Bean.class) : ctx.query(\"bean\").toNullable(tests.validation.Bean.class)))")
17+
);
18+
19+
assertTrue(source.contains(
20+
"c.validateFormBean(io.jooby.validation.ValidationHelper.validate(ctx, ctx.form(\"bean\").isMissing() ? ctx.form().toNullable(tests.validation.Bean.class) : ctx.form(\"bean\").toNullable(tests.validation.Bean.class)))")
21+
);
22+
23+
assertTrue(source.contains(
24+
"c.validateBodyBean(io.jooby.validation.ValidationHelper.validate(ctx, ctx.body(tests.validation.Bean.class)))")
25+
);
26+
27+
});
28+
}
29+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package tests.validation;
2+
3+
import io.jooby.annotation.FormParam;
4+
import io.jooby.annotation.POST;
5+
import io.jooby.annotation.QueryParam;
6+
import jakarta.validation.Valid;
7+
8+
public class BeanValidationsController {
9+
10+
@POST("/validate/query-bean")
11+
public Bean validateQueryBean(@Valid @QueryParam Bean bean) {
12+
return bean;
13+
}
14+
15+
@POST("/validate/form-bean")
16+
public Bean validateFormBean(@Valid @FormParam Bean bean) {
17+
return bean;
18+
}
19+
20+
@POST("/validate/body-bean")
21+
public Bean validateBodyBean(@Valid Bean bean) {
22+
return bean;
23+
}
24+
25+
}

modules/jooby-hbv/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@
1919
<version>${jooby.version}</version>
2020
</dependency>
2121

22+
<dependency>
23+
<groupId>io.jooby</groupId>
24+
<artifactId>jooby-validation</artifactId>
25+
<version>${jooby.version}</version>
26+
</dependency>
27+
2228
<!-- Hibernate Validator -->
2329
<dependency>
2430
<groupId>org.hibernate.validator</groupId>

modules/jooby-hbv/src/main/java/io/jooby/hbv/HbvModule.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,5 @@ public void install(@NonNull Jooby application) {
4040
Validator validator = factory.getValidator();
4141
application.getServices().put(Validator.class, validator);
4242
}
43-
4443
}
4544
}

modules/jooby-validation/pom.xml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
5+
6+
<parent>
7+
<groupId>io.jooby</groupId>
8+
<artifactId>modules</artifactId>
9+
<version>3.3.0-SNAPSHOT</version>
10+
</parent>
11+
12+
<modelVersion>4.0.0</modelVersion>
13+
<artifactId>jooby-validation</artifactId>
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>io.jooby</groupId>
18+
<artifactId>jooby</artifactId>
19+
<version>${jooby.version}</version>
20+
</dependency>
21+
22+
<dependency>
23+
<groupId>jakarta.validation</groupId>
24+
<artifactId>jakarta.validation-api</artifactId>
25+
</dependency>
26+
27+
</dependencies>
28+
</project>

0 commit comments

Comments
 (0)