Skip to content

Commit d6e42f2

Browse files
committed
#14 - Support bean validation
1 parent adb5e48 commit d6e42f2

File tree

7 files changed

+61
-10
lines changed

7 files changed

+61
-10
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131
<version>1</version>
3232
</dependency>
3333

34+
<dependency>
35+
<groupId>javax.validation</groupId>
36+
<artifactId>validation-api</artifactId>
37+
<version>2.0.1.Final</version>
38+
</dependency>
39+
3440
<dependency>
3541
<groupId>io.dinject</groupId>
3642
<artifactId>dinject-controller</artifactId>

src/main/java/io/dinject/javalin/generator/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ class Constants {
1919
static final String IMPORT_PATH_TYPE_CONVERT = "import static io.dinject.controller.PathTypeConversion.*;";
2020

2121
static final String IMPORT_CONTROLLER = "io.dinject.controller.*";
22+
static final String VALIDATOR = "io.dinject.controller.Validator";
2223

2324
}

src/main/java/io/dinject/javalin/generator/ControllerReader.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import javax.lang.model.type.TypeKind;
1414
import javax.lang.model.type.TypeMirror;
1515
import javax.lang.model.util.ElementFilter;
16+
import javax.validation.Valid;
1617
import java.lang.annotation.Annotation;
1718
import java.util.ArrayList;
1819
import java.util.List;
@@ -50,6 +51,8 @@ class ControllerReader {
5051

5152
private boolean docHidden;
5253

54+
private final boolean includeValidator;
55+
5356
ControllerReader(TypeElement beanType, ProcessingContext ctx) {
5457
this.beanType = beanType;
5558
this.ctx = ctx;
@@ -62,10 +65,14 @@ class ControllerReader {
6265
if (ctx.isOpenApiAvailable()) {
6366
docHidden = initDocHidden();
6467
}
68+
includeValidator = initIncludeValidator();
6569
importTypes.add(Constants.SINGLETON);
6670
importTypes.add(Constants.API_BUILDER);
6771
importTypes.add(Constants.IMPORT_CONTROLLER);
6872
importTypes.add(beanType.getQualifiedName().toString());
73+
if (includeValidator) {
74+
importTypes.add(Constants.VALIDATOR);
75+
}
6976

7077
this.produces = initProduces();
7178
}
@@ -134,6 +141,10 @@ private boolean initDocHidden() {
134141
return findAnnotation(Hidden.class) != null;
135142
}
136143

144+
private boolean initIncludeValidator() {
145+
return findAnnotation(Valid.class) != null;
146+
}
147+
137148
String getProduces() {
138149
return produces;
139150
}
@@ -146,6 +157,10 @@ boolean isDocHidden() {
146157
return docHidden;
147158
}
148159

160+
boolean isIncludeValidator() {
161+
return includeValidator;
162+
}
163+
149164
void read() {
150165
if (!roles.isEmpty()) {
151166
addStaticImportType(ctx.isJavalin3() ? JAVALIN3_ROLES : JAVALIN2_ROLES);
@@ -156,7 +171,7 @@ void read() {
156171

157172
for (Element element : beanType.getEnclosedElements()) {
158173
if (element.getKind() == ElementKind.METHOD) {
159-
readMethod((ExecutableElement)element);
174+
readMethod((ExecutableElement) element);
160175
}
161176
}
162177

@@ -170,13 +185,13 @@ private void readSuper(TypeElement beanType) {
170185

171186
TypeMirror superclass = beanType.getSuperclass();
172187
if (superclass.getKind() != TypeKind.NONE) {
173-
DeclaredType declaredType = (DeclaredType)superclass;
188+
DeclaredType declaredType = (DeclaredType) superclass;
174189

175190
final Element superElement = ctx.asElement(superclass);
176191
if (!"java.lang.Object".equals(superElement.toString())) {
177192
for (Element element : superElement.getEnclosedElements()) {
178193
if (element.getKind() == ElementKind.METHOD) {
179-
readMethod((ExecutableElement)element, declaredType);
194+
readMethod((ExecutableElement) element, declaredType);
180195
}
181196
}
182197
if (superElement instanceof TypeElement) {
@@ -195,7 +210,7 @@ private void readMethod(ExecutableElement method, DeclaredType declaredType) {
195210
ExecutableType actualExecutable = null;
196211
if (declaredType != null) {
197212
// actual taking into account generics
198-
actualExecutable = (ExecutableType)ctx.asMemberOf(declaredType, method);
213+
actualExecutable = (ExecutableType) ctx.asMemberOf(declaredType, method);
199214
}
200215

201216
MethodReader methodReader = new MethodReader(this, method, actualExecutable, ctx);

src/main/java/io/dinject/javalin/generator/ControllerRouteWriter.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,22 @@ private void writeClassStart() {
8080
writer.append("@Singleton").eol();
8181
writer.append("public class ").append(shortName).append("$route implements WebRoutes {").eol().eol();
8282

83-
writer.append(" private final %s controller;", shortName).eol().eol();
83+
writer.append(" private final %s controller;", shortName).eol();
84+
if (reader.isIncludeValidator()) {
85+
writer.append(" private final Validator validator;").eol();
86+
}
87+
writer.eol();
8488

85-
writer.append(" public %s$route(%s controller) {", shortName, shortName).eol();
86-
writer.append(" this.controller = controller;", shortName, shortName).eol();
87-
writer.append(" }", shortName, shortName).eol().eol();
89+
writer.append(" public %s$route(%s controller", shortName, shortName);
90+
if (reader.isIncludeValidator()) {
91+
writer.append(", Validator validator");
92+
}
93+
writer.append(") {").eol();
94+
writer.append(" this.controller = controller;").eol();
95+
if (reader.isIncludeValidator()) {
96+
writer.append(" this.validator = validator;").eol();
97+
}
98+
writer.append(" }").eol().eol();
8899
}
89100

90101
private void writePackage() {

src/main/java/io/dinject/javalin/generator/ElementReader.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,13 @@ void buildApiDocumentation(MethodDocBuilder methodDoc) {
157157
}
158158
}
159159

160+
void writeValidate(Append writer) {
161+
if (!isJavalinContext() && typeHandler == null) {
162+
writer.append("validator.validate(%s);", varName).eol();
163+
writer.append(" ");
164+
}
165+
}
166+
160167
void writeCtxGet(Append writer, PathSegments segments) {
161168

162169
if (isJavalinContext()) {

src/main/java/io/dinject/javalin/generator/MethodParam.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@ public class MethodParam {
1212
this.elementParam = new ElementReader(param, rawType, ctx, defaultParamType, formMarker);
1313
}
1414

15-
void buildCtxGet(Append writer, PathSegments segments) {
15+
void writeCtxGet(Append writer, PathSegments segments) {
1616
elementParam.writeCtxGet(writer, segments);
1717
}
1818

1919
void addImports(ControllerReader bean) {
2020
elementParam.addImports(bean);
2121
}
2222

23+
void writeValidate(Append writer) {
24+
elementParam.writeValidate(writer);
25+
}
26+
2327
void buildParamName(Append writer) {
2428
elementParam.writeParamName(writer);
2529
}

src/main/java/io/dinject/javalin/generator/MethodReader.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,20 @@ void addRoute(Append writer) {
148148
}
149149

150150
for (MethodParam param : params) {
151-
param.buildCtxGet(writer, segments);
151+
param.writeCtxGet(writer, segments);
152152
}
153153
writer.append(" ");
154154

155155
if (!isVoid()) {
156156
writeContextReturn(writer);
157157
}
158+
159+
if (bean.isIncludeValidator() && webMethod != WebMethod.GET) {
160+
for (MethodParam param : params) {
161+
param.writeValidate(writer);
162+
}
163+
}
164+
158165
writer.append("controller.");
159166
writer.append(element.getSimpleName().toString()).append("(");
160167
for (int i = 0; i < params.size(); i++) {

0 commit comments

Comments
 (0)