Je souhaite utiliser Constructor Injection, car cela rend mes tests unitaires plus sûrs et plus faciles à écrire : je ne peux pas oublier de définir les champs à injecter. CDI prend en charge cela, et le javadoc de l'annotation @Inject dit : "@Inject est facultatif pour les constructeurs publics sans argument lorsqu'aucun autre constructeur n'est présent. Cela permet aux injecteurs d'invoquer les constructeurs par défaut."

Je comprends que d'autres normes nécessitent un constructeur sans argument (par exemple JAX-RS ; voir cette question), ce qui est décevant. Mais même pour une classe simple comme :

public class Bar {
    private final Foo foo;

    public Bar(Foo foo) {
        this.foo = foo;
    }
}

La soudure échoue en disant : DeploymentException: WELD-001408: Unsatisfied dependencies for type Bar. Lorsque j'ajoute l'annotation @Inject, cela fonctionne.

Je ne m'attends vraiment plus à aucun bogue dans Weld, car il est bien établi depuis des années; J'ai probablement un problème. Mais peut-être que cela a échappé à l'attention, simplement parce que la communauté Jakarta EE ne fait tout simplement aucune injection de constructeur.

1
rü- 27 janv. 2020 à 15:21

1 réponse

Meilleure réponse

Ce n'est pas un bug de soudure. Comme l'indique la spécification, vous avez besoin de @javax.inject.Inject sur votre constructeur. La seule fois où vous n'en avez pas besoin, c'est lorsque vous avez un constructeur sans argument et que vous ne souhaitez pas qu'un autre constructeur soit appelé par le conteneur.

2
Laird Nelson 27 janv. 2020 à 17:01