Skip to content

Commit dda793f

Browse files
committed
#439 Handle case where method injection throws exception
Adds a try catch block to the generated code
1 parent 4a36249 commit dda793f

File tree

4 files changed

+31
-5
lines changed

4 files changed

+31
-5
lines changed

inject-generator/src/main/java/io/avaje/inject/generator/BeanReader.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,4 +448,13 @@ private String beanPackageName() {
448448
private String beanQualifiedName() {
449449
return beanType.getQualifiedName().toString();
450450
}
451+
452+
boolean needsTryForMethodInjection() {
453+
for (MethodReader injectMethod : injectMethods) {
454+
if (injectMethod.methodThrows()) {
455+
return true;
456+
}
457+
}
458+
return false;
459+
}
451460
}

inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ void buildAddFor(Append writer) {
281281
writer.append(")) {").eol();
282282
}
283283

284-
private boolean methodThrows() {
284+
boolean methodThrows() {
285285
return !element.getThrownTypes().isEmpty();
286286
}
287287

inject-generator/src/main/java/io/avaje/inject/generator/SimpleBeanWriter.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,22 @@ private void injectFields() {
226226
}
227227

228228
private void injectMethods() {
229-
String bean = beanReader.prototype() ? "bean" : "$bean";
230-
String builder = beanReader.prototype() ? "builder" : "b";
229+
final var needsTry = beanReader.needsTryForMethodInjection();
230+
final var bean = beanReader.prototype() ? "bean" : "$bean";
231+
final var builder = beanReader.prototype() ? "builder" : "b";
232+
if (needsTry) {
233+
writer.indent(" try {").eol();
234+
}
235+
final var indent = needsTry ? " " : " ";
231236
for (MethodReader methodReader : beanReader.injectMethods()) {
232-
writer.indent(" ").append("%s.%s(", bean, methodReader.name());
237+
writer.indent(indent).append("%s.%s(", bean, methodReader.name());
233238
writeMethodParams(builder, methodReader);
234239
}
240+
if (needsTry) {
241+
writer.indent(" } catch (Throwable e) {").eol();
242+
writer.indent(" throw new RuntimeException(\"Error wiring method\", e);").eol();
243+
writer.indent(" }").eol();
244+
}
235245
}
236246

237247
private void writeMethodParams(String builderRef, MethodReader methodReader) {

inject-test/src/test/java/org/example/coffee/fruit/AppleService.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import jakarta.inject.Inject;
44
import jakarta.inject.Singleton;
55

6+
import java.io.IOException;
7+
68
@Singleton
79
public class AppleService {
810

@@ -11,8 +13,13 @@ public class AppleService {
1113

1214
PeachService peachService;
1315

16+
public AppleService() throws IOException {
17+
// maybe I throw on construction
18+
}
19+
1420
@Inject
15-
void setPeachService(PeachService peachService) {
21+
void setPeachService(PeachService peachService) throws IOException {
22+
// maybe I throw on method injection
1623
this.peachService = peachService;
1724
}
1825

0 commit comments

Comments
 (0)