Maison >Java >javaDidacticiel >Pourquoi est-ce que j'obtiens un EJB nul lors de son injection dans un service Web JAX-RS ?

Pourquoi est-ce que j'obtiens un EJB nul lors de son injection dans un service Web JAX-RS ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-08 00:21:03708parcourir

Why Do I Get a Null EJB When Injecting It into a JAX-RS Webservice?

Injection d'EJB dans le service Web JAX-RS : un guide complet

Dans le domaine du développement Java Enterprise Edition (JEE), il est souvent nécessaire d'injecter un EJB sans état dans un service Web JAX-RS pour un accès efficace aux données. Cependant, rencontrer un EJB nul et la redoutable NullPointerException peut être frustrant. Cet article examine les causes et propose des solutions pratiques pour résoudre ce problème.

Les tentatives initiales d'injection de l'EJB via des annotations peuvent ne pas toujours réussir en raison des limitations sous-jacentes de la plate-forme. Pour résoudre ce problème, vous pouvez adopter plusieurs approches :

Option 1 : Utiliser le SPI du fournisseur d'injection

Le SPI du fournisseur d'injection fournit un hook pour personnaliser le processus d'injection. En implémentant un InjectableProvider, vous pouvez indiquer au conteneur comment résoudre et injecter l'EJB dans votre ressource JAX-RS. Vous trouverez ci-dessous un exemple pour le serveur Jersey :

@Provider
public class EJBProvider implements InjectableProvider<EJB, Type> {
    // ... Implementation Details ...
}

Option 2 : élever le BookResource au rang d'EJB

En faisant du BookResource un EJB lui-même, vous vous assurez que le conteneur EJB gère le cycle de vie et des injections au sein de la classe. Cela élimine le besoin d'annotations externes :

@Stateless
@Path("book")
public class BookResource {
    @EJB
    private BookEJB bookEJB;
    // ...
}

Option 3 : exploitez la puissance du CDI

CDI (Contexts and Dependency Injection) offre une approche pratique et configurée de manière déclarative pour injecter des EJB. En utilisant l'annotation @Inject, vous pouvez accéder de manière transparente à l'EJB injecté dans votre ressource JAX-RS :

@Path("book")
@RequestScoped
public class BookResource {
    @Inject
    private BookEJB bookEJB;
    // ...
}

Il convient de noter que la sélection de l'approche appropriée dépend des exigences spécifiques et des considérations de conception de votre application. L'option 1 offre un contrôle précis du processus d'injection, tandis que les options 2 et 3 le simplifient en tirant parti des mécanismes EJB ou CDI standard.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn