Skip to content

Commit 54bc840

Browse files
committed
jooby-apt: generate constructors from source controllers
- support default constructor with injected fields - ref #3469
1 parent 5fb1259 commit 54bc840

File tree

5 files changed

+45
-12
lines changed

5 files changed

+45
-12
lines changed

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.nio.charset.StandardCharsets;
1515
import java.util.*;
1616
import java.util.function.BiConsumer;
17+
import java.util.function.Predicate;
1718
import java.util.stream.Collectors;
1819
import java.util.stream.Stream;
1920

@@ -181,7 +182,6 @@ private StringBuilder trimr(StringBuilder buffer) {
181182
}
182183

183184
private StringBuilder constructors(String generatedName, boolean kt) {
184-
var injectAnnotations = Set.of("javax.inject.Inject", "jakarta.inject.Inject");
185185
var constructors =
186186
getTargetType().getEnclosedElements().stream()
187187
.filter(
@@ -193,17 +193,15 @@ private StringBuilder constructors(String generatedName, boolean kt) {
193193
var targetType = getTargetType().getSimpleName();
194194
var buffer = new StringBuilder();
195195
buffer.append(System.lineSeparator());
196+
// Inject could be at constructor or field level.
196197
var injectConstructor =
197-
constructors.stream()
198-
.filter(
199-
it ->
200-
injectAnnotations.stream()
201-
.anyMatch(annotation -> findAnnotationByName(it, annotation) != null))
202-
.findFirst()
203-
.orElse(null);
198+
constructors.stream().filter(hasInjectAnnotation()).findFirst().orElse(null);
199+
var inject =
200+
injectConstructor != null
201+
|| getTargetType().getEnclosedElements().stream().anyMatch(hasInjectAnnotation());
204202
final var defaultConstructor =
205203
constructors.stream().filter(it -> it.getParameters().isEmpty()).findFirst().orElse(null);
206-
if (injectConstructor != null) {
204+
if (inject) {
207205
constructor(
208206
generatedName,
209207
kt,
@@ -259,7 +257,7 @@ private StringBuilder constructors(String generatedName, boolean kt) {
259257
}
260258
}
261259

262-
if (injectConstructor != null) {
260+
if (inject) {
263261
if (kt) {
264262
constructor(
265263
generatedName,
@@ -299,6 +297,13 @@ private StringBuilder constructors(String generatedName, boolean kt) {
299297
return trimr(buffer).append(System.lineSeparator());
300298
}
301299

300+
private static Predicate<Element> hasInjectAnnotation() {
301+
var injectAnnotations = Set.of("javax.inject.Inject", "jakarta.inject.Inject");
302+
return it ->
303+
injectAnnotations.stream()
304+
.anyMatch(annotation -> findAnnotationByName(it, annotation) != null);
305+
}
306+
302307
private void constructor(
303308
String generatedName,
304309
boolean kt,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package tests.i3469;
7+
8+
import io.jooby.annotation.GET;
9+
import jakarta.inject.Inject;
10+
11+
public class C3469FieldInject {
12+
13+
@Inject private Foo3469 foo;
14+
15+
@GET("/3469")
16+
public String method() {
17+
return foo.foo();
18+
}
19+
}

modules/jooby-apt/src/test/java/tests/i3469/Issue3469.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,13 @@ public void shouldGenerateConstructors() throws Exception {
3131
assertFalse(source.toString().contains("public C3469_()"));
3232
});
3333
}
34+
35+
@Test
36+
public void shouldGenerateFieldInjectWithDefaultConstructor() throws Exception {
37+
new ProcessorRunner(new C3469FieldInject())
38+
.withSource(
39+
source -> {
40+
assertTrue(source.toString().contains("this(C3469FieldInject.class);"));
41+
});
42+
}
3443
}

tests/src/test/java/io/jooby/i2457/ControllersAppV12457.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
public class ControllersAppV12457 extends Jooby {
1111

1212
public ControllersAppV12457() {
13-
mvc(ControllerV12457.class);
13+
mvc(new ControllerV12457_());
1414
}
1515
}

tests/src/test/java/io/jooby/i2457/ControllersAppV22457.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
public class ControllersAppV22457 extends Jooby {
1111

1212
public ControllersAppV22457() {
13-
mvc(ControllerV22457.class);
13+
mvc(new ControllerV22457_());
1414
}
1515
}

0 commit comments

Comments
 (0)