2016-03-25 8 views
2

Ich habe einen @Provider, der ein ClientRequestFilter implementiert. Der Provider selbst wird überhaupt nicht gefunden. Wenn ich es manuell registriere, wird es entdeckt.So injizieren CDI-Abhängigkeit in JAX-RS ClientRequestFilter-Provider

ClientBuilder.newBuilder().register(Somefilter.class); 

Auf diese Weise jedoch nicht CDI keine Abhängigkeiten in Somefilter injizieren.

  • AS: Wildfly 10
  • JAX-RS: Resteasy (Baujahr Wildfly)

Der Code meiner Somefilter Klasse sieht wie folgt aus.

@Provider 
public class Somefilter implements ClientRequestFilter { 

@Inject 
private AccountService accountService; 


@Override 
public void filter(ClientRequestContext requestContext) throws IOException { 
    System.out.println(accountService); 

} 

}

Die Anwendung hat auch einen Serverteil, konfiguriert mit @Application Anmerkung, einige Klassen mit der Umsetzung ContainerRequestFilter. Diese werden von Resteasy und sogar CDI-Injektionsarbeiten entdeckt.

So ist die Frage, wie kann ich Client-API-verwandte Anbieter injizieren CDI-Abhängigkeiten.

Antwort

3

@Provider Implementierungen werden automatisch auf der Serverseite, aber nicht auf der Clientseite erkannt.

Genau dies versuchen:

@Inject 
private Somefilter someFilter; 

ClientBuilder.newBuilder().register(someFilter); 

Achten Sie auf eine bohnen definieren Anmerkung zu Somefilter (z @Dependent) hinzuzufügen.

+0

Dieser Ansatz funktioniert. Vielen Dank. –

+0

Ist es irgendwie möglich, das Filter pro Anfrage instanziieren zu lassen? –

+0

Ich nehme an, wenn der Filter '@ RequestScoped' ist. –

0

Achten Sie darauf, das richtige Paket importieren javax.enterprise.context zur Feststellung des @RequestScoped Spielraum für Ihre Serviceklasse:

import javax.enterprise.context.RequestScoped; 

@Named 
@RequestScoped 
public class AccountService { 

} 

Ich war mit diesem Problem und fand heraus, dass ich fälschlicherweise die Faces (JSF) Paket stattdessen wurde mit welcher war javax.faces.bean.RequestScoped.