Recherche JNDI vs Injection CDI
Remplace les fragiles recherches JNDI par chaînes par l'injection CDI avec sécurité de types pour les ressources gérées par le conteneur.
public class OrderService {
private DataSource ds;
public void init() throws NamingException {
InitialContext ctx = new InitialContext();
ds = (DataSource) ctx.lookup(
"java:comp/env/jdbc/OrderDB");
}
public List<Order> findAll()
throws SQLException {
try (Connection con = ds.getConnection()) {
// query orders
}
}
}
@ApplicationScoped
public class OrderService {
@Inject
@Resource(name = "jdbc/OrderDB")
DataSource ds;
public List<Order> findAll()
throws SQLException {
try (Connection con = ds.getConnection()) {
// query orders
}
}
}
Câblage avec sécurité de types
Les erreurs d'injection sont détectées au déploiement, pas à l'exécution via des recherches par chaîne.
Sans code répétitif
Élimine la création d'InitialContext, les chaînes de noms JNDI et la gestion de NamingException.
Testable
Les dépendances sont des champs injectés, facilement remplaçables par des mocks dans les tests unitaires.
Disponible depuis Jakarta EE 8 / Java 11
Le pattern JNDI traditionnel oblige à utiliser des noms de ressources basés sur des chaînes, à gérer NamingException et à gérer un InitialContext. L'injection CDI avec @Inject (ou @Resource pour les ressources du conteneur) permet au conteneur de connecter les dépendances automatiquement. Les fautes de frappe deviennent des erreurs à la compilation, et les classes sont plus faciles à tester car les dépendances peuvent être injectées directement.