2016-10-07 7 views
2

Ich verstehe nicht, warum CDI Verwendung der Injektion nicht funktioniert mit WebSockets, mit Sog.Undertow Websocket Bean Injection CDI Problem

Unten ist der Code, den ich für einen einfachen Websocket Endpunkt habe.

@ServerEndpoint("/") 
public class TestWebSocketEndpoint { 

    @Inject 
    private RetrieveAccessor retrieveAccessor; 

    private final Logger logger = Logger.getLogger(this.getClass().getName()); 

    @OnOpen 
    public void onConnectionOpen(Session session) { 
     logger.info("Connection opened ... " + session.getId()); 
    } 

    @OnMessage 
    public String onMessage(String message) { 

     if (!message.isEmpty()) { 
      return message; 
     } 

     System.out.println("RETRIEVE BEAN -> " + retrieveAccessor); 
     if (retrieveAccessor != null) { 
      return "BEAN NOT NULL"; 
     } 
     return ":("; 
    } 

    @OnClose 
    public void onConnectionClose(Session session) { 
     logger.info("Connection close .... " + session.getId()); 
    } 

} 

Natürlich ist das Problem, dass die injected-Eigenschaft null ist. Ich habe natürlich keine Probleme damit, den Rest der Dinge für diesen Einsatz und die Injektion der unten beschriebenen zustandslosen Bohne zu verwenden. Gibt es eine Arbeit dafür, was sind die Probleme, denen ich begegnen könnte, wenn ich nur Eigenschaften, die ich brauche, die Bohnen sind? Weil das definitiv funktioniert.

RetrieveAccessor retrieveAccessor = new .... {code}

+0

Der letzte Teil Ihrer Frage ist verwirrend. Implementieren Sie Ihren 'RetrieveAccessor'? Sie erwähnen auch Sog. Verwenden Sie Weld Servlet? Wildfliege? –

+0

Ich benutze nur undingow, und der letzte Teil meiner Frage erklärt nur, dass eine normale Klasseninitialisierung dieses Bean-Objekts funktioniert, was Konsequenzen daraus haben würde. – thekevshow

Antwort

2

Eine einfache Möglichkeit zum Erzielen von Injektionsfunktionen für Ihre @ServerEndpoint-Klassen mit Anmerkungen besteht darin, einen benutzerdefinierten Konfigurator für die Erstellung der Endpunktinstanz durch Überschreiben der Methode getEndpointInstance (Class endpointClass) zur Instanziierung mit CDI festzulegen.

https://tyrus.java.net/documentation/1.13/user-guide.html#d0e464

Kommentierte Endpunkt:

@ServerEndpoint(value = "/", configurator = CDIEndpointConfigurator.class) 
public class TestWebSocketEndpoint { 
    ... 
} 

Individuelle Konfigurator:

public class CDIEndpointConfigurator extends ServerEndpointConfig.Configurator { 

    @Override 
    public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException { 
     return CDI.current().select(endpointClass).get(); 
    } 
} 
+0

Ich werde das heute oder morgen versuchen und dieses korrekt markieren, wenn es funktioniert, ich hatte das gesehen aber hatte es nicht wirklich versucht, ich denke du hast es doch gut erklärt. – thekevshow

+0

Tut mir leid, dass ich nicht so schnell dazu gekommen bin, also habe ich vorher schon etwas Ähnliches versucht, aber ich muss es falsch gemacht haben. Das ist die richtige Antwort, vielen Dank. – thekevshow

+0

Sie sind herzlich willkommen. –

1

Undertow ist nur ein Servlet-Container. Weld (oder OWB) bietet CDI-Unterstützung. Ich bin mir nicht sicher, wie Sie Undertow instanziieren, aber Sie müssen Weld (oder eine andere CDI-Implementierung) nutzen.

Hier ist ein Beispiel, wie es geht. Nutzen Sie eine CDI Extension, um die Endpunkte zu finden, und sobald Sie sie haben, können Sie register them in Undertow

Fühlen Sie sich frei, Hängematte für diese Hebelwirkung.

+0

Ich benutze undertow als eigenständigen Web Service/Micro Service. Ich habe ursprünglich nicht verstanden, was du verlangst, aber ja, ich habe Weld benutzt, um meine CDI-Unterstützung bereitzustellen, das sollte hilfreich sein, ich war ein wenig beschäftigt, wenn ich in der Lage bin, das zu implementieren, was du mir gezeigt hast, Ich werde dies als die richtige/akzeptierte Antwort bezeichnen. Vielen Dank. (PS: dein Framework ist cool) – thekevshow

Verwandte Themen