Skip to content

Commit 2190266

Browse files
committed
Skip generation of validators for @controllers
1 parent 75d2c81 commit 2190266

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package example.avaje.controller;
2+
3+
import io.avaje.http.api.Controller;
4+
import io.avaje.http.api.Valid;
5+
6+
@Valid
7+
@Controller
8+
public class MyController {
9+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package example.avaje.controller;
2+
3+
import io.avaje.validation.Validator;
4+
import org.junit.jupiter.api.Test;
5+
6+
import static org.assertj.core.api.Assertions.assertThat;
7+
import static org.junit.jupiter.api.Assertions.assertThrows;
8+
9+
class MyControllerTest {
10+
11+
final Validator validator = Validator.builder().build();
12+
13+
@Test
14+
void expectNoValidator() {
15+
String message = assertThrows(IllegalArgumentException.class, () -> {
16+
validator.validate(new MyController());
17+
}).getMessage();
18+
19+
assertThat(message).contains("No ValidationAdapter for class example.avaje.controller.MyController");
20+
}
21+
}

validator-generator/src/main/java/io/avaje/validation/generator/ValidationProcessor.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@
1717
import javax.annotation.processing.RoundEnvironment;
1818
import javax.annotation.processing.SupportedAnnotationTypes;
1919
import javax.lang.model.SourceVersion;
20-
import javax.lang.model.element.Element;
21-
import javax.lang.model.element.ElementKind;
22-
import javax.lang.model.element.ExecutableElement;
23-
import javax.lang.model.element.TypeElement;
20+
import javax.lang.model.element.*;
21+
import javax.lang.model.type.DeclaredType;
2422
import javax.lang.model.type.TypeMirror;
2523
import javax.lang.model.util.ElementFilter;
2624

@@ -208,24 +206,34 @@ private void writeAdapters(Set<? extends Element> beans) {
208206
private void writeContraintAdapters(Set<? extends Element> beans) {
209207
ElementFilter.typesIn(beans).stream()
210208
.filter(
211-
t ->
212-
t.getAnnotationMirrors().stream()
209+
type ->
210+
type.getAnnotationMirrors().stream()
213211
.anyMatch(m -> ConstraintPrism.isPresent(m.getAnnotationType().asElement())))
214-
.forEach(this::writeAdapterForContraint);
212+
.forEach(this::writeAdapterForConstraint);
215213
}
216214

217215
private void writeAdapterForType(TypeElement typeElement) {
216+
if (isController(typeElement)) {
217+
// @Valid on controller just indicating the controller request
218+
// payloads should be validated - ignore this one
219+
return;
220+
}
218221
final ClassReader beanReader = new ClassReader(typeElement);
219222
writeAdapter(typeElement, beanReader);
220223
}
221224

222-
private void writeAdapterForContraint(TypeElement typeElement) {
225+
private boolean isController(TypeElement typeElement) {
226+
return typeElement.getAnnotationMirrors().stream()
227+
.map(AnnotationMirror::getAnnotationType)
228+
.map(DeclaredType::toString)
229+
.anyMatch(val -> val.endsWith(".Controller"));
230+
}
223231

232+
private void writeAdapterForConstraint(TypeElement typeElement) {
224233
if (ElementFilter.methodsIn(typeElement.getEnclosedElements()).stream()
225234
.noneMatch(m -> "message".equals(m.getSimpleName().toString()))) {
226235
throw new IllegalStateException("Constraint annotations must contain a message method");
227236
}
228-
229237
final ContraintReader beanReader = new ContraintReader(typeElement);
230238
writeAdapter(typeElement, beanReader);
231239
}

0 commit comments

Comments
 (0)