Skip to content

Commit 9847bba

Browse files
authored
Merge pull request quarkusio#46649 from Ladicek/arc-multiple-disposers-error
ArC: improve error message in case multiple disposers are found for a producer
2 parents 7c3c452 + 99c1c55 commit 9847bba

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanDeployment.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -1473,7 +1473,12 @@ private DisposerInfo findDisposer(Set<Type> beanTypes, BeanInfo declaringBean, A
14731473
}
14741474
}
14751475
if (found.size() > 1) {
1476-
throw new DefinitionException("Multiple disposer methods found for " + producer);
1476+
StringBuilder error = new StringBuilder("Multiple disposer methods found for producer '")
1477+
.append(producer).append("' declared on ").append(declaringBean).append(":\n");
1478+
for (DisposerInfo disposer : found) {
1479+
error.append("\t- ").append(disposer.getDisposerMethod()).append("\n");
1480+
}
1481+
throw new DefinitionException(error.toString());
14771482
}
14781483
return found.isEmpty() ? null : found.get(0);
14791484
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.quarkus.arc.test.producer.disposer.illegal;
2+
3+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
4+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import jakarta.enterprise.context.Dependent;
8+
import jakarta.enterprise.inject.Disposes;
9+
import jakarta.enterprise.inject.Produces;
10+
import jakarta.enterprise.inject.spi.DefinitionException;
11+
12+
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.extension.RegisterExtension;
14+
15+
import io.quarkus.arc.test.ArcTestContainer;
16+
17+
public class MultipleDisposersTest {
18+
@RegisterExtension
19+
public ArcTestContainer container = ArcTestContainer.builder()
20+
.beanClasses(ProducerDisposer.class)
21+
.shouldFail()
22+
.build();
23+
24+
@Test
25+
public void trigger() {
26+
Throwable error = container.getFailure();
27+
assertNotNull(error);
28+
assertInstanceOf(DefinitionException.class, error);
29+
assertTrue(error.getMessage().contains("Multiple disposer methods found"));
30+
assertTrue(error.getMessage().contains("produceString"));
31+
assertTrue(error.getMessage().contains("disposeString"));
32+
assertTrue(error.getMessage().contains("disposeCharSequence"));
33+
}
34+
35+
@Dependent
36+
static class ProducerDisposer {
37+
@Produces
38+
@Dependent
39+
String produceString() {
40+
return "";
41+
}
42+
43+
void disposeString(@Disposes String ignored) {
44+
}
45+
46+
void disposeCharSequence(@Disposes CharSequence ignored) {
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)