Nicht in der Lage zu injizieren, @ApplicationScoped bean in der JAX-RS-service
Habe ich erstellt JAX-RS-service, in dem ich möchte, um zu injizieren, eine Anwendung scoped bean. Das problem ist, dass die bean wird nicht injiziert. Wie wird das verursacht und wie kann ich es lösen?
JAX-RS-service:
@Path("room")
public class RoomService {
@Inject
GameController gc;
public RoomService() {}
@Path("create")
@GET
@Produces("application/json")
public String create() {
Room r = new Room();
gc.addRoom(r); //gc is null
return r.toJson();
}
}
Application-scoped bean
import java.util.ArrayList;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import pepuch.multuplayergameserver.entity.Game;
import pepuch.multuplayergameserver.entity.Room;
@Named
@ApplicationScoped
public class GameController {
private Game game;
public GameController() {
this.game = new Game(new ArrayList<Room>());
}
public boolean addRoom(Room room) {
if (!game.getRooms().contains(room)) {
return game.getRooms().add(room);
}
return false;
}
}
- Ihre
GameController
code nicht kompilieren und es fehlen auch@Named
. Bitte nicht schreiben Sie nicht getesteten code. Copypaste der realen und getesteten code statt. - Ich habe es behoben. Sorry. Ich habe
@Named
aber es funktioniert immer noch nicht. Ich dachte, dass@Named
ist nur fürEL
, das ist, warum ich nicht fügen Sie diese vor. - Warum @Benannte? Wird nicht keinen Unterschied machen.
- Nur um es klar, deutlich für alle, die dies Lesen, als Karl Kilden und pepuch wies darauf hin, @Named ist nur erforderlich für EL.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie brauchen, um die Bohne einer verwalteten Ressource zu machen, berechtigt, für die Injektion. Am bloßen minimum, fügen Sie
@RequestScoped
zu den JAX-RS SIB zu machen injection-würdig.Andere alternative annotation ist
@ManagedBean
. Der Punkt ist , das Jersey nicht Adresse die gewünschte Injektion Ziel, wenn die Eltern Bohne ist nicht in einer verwalteten KontextEDIT: sicher sein, ein beans.xml Datei in Ihrem WEB-INF-Ordner. Ihre beans.xml die Datei wird ungefähr so Aussehen:
EDIT: Basierend auf dieses JIRA, können Sie ersetzen Sie
@RequestScoped
mit@ManagedBean
@RequestScoped
zu jax-rs-Klasse, aber es funktioniert immer noch nicht.Die built-in-context-Objekt aktiv ist, während servlet, web-service und EJB-Aufrufe, oder im Falle der Konversation Kontext-Objekt, für JSF-Anfragen.
Können Sie Schwierigkeiten haben, den Zugriff auf Anfrage,Geltungsbereich und Bohnen aus der JAX-RS-service, da es nicht eindeutig fest, die Unterstützung für diese , aber in Ihrem Fall scheint es, wie Sie brauchen nur ein singleton ist eher als eine Kontext-basierte bean.
Halten Sie es, wenn Sie mit CDI - (beans.xml),
Wenn Sie mit CDI mit Feder (keine beans.xml), dann halten die
@Named
Wenn die oben nicht funktioniert, dann werde ich vorschlagen, die Kennzeichnung der JAX-RS-service als
@ManagedBean
zusammen mit der obigen änderung als es ist unklar, ob die CDI steuert JAX-RS-service.@Singleton
. Warum habe ich verwendet@ApplicationScoped
? Ich bin neu in JEE und ich dachte, dassApplicationScoped
bean funktioniert wieSingleton
.Singleton
geschaffen für die ganze jee-container undApplicationScoped
ist erstellt nur für die Anwendung?Hinzufügen cdi-api.jar zu Ihrem Projekt.