L'injection dans un Jersey de classe de Ressource
J'ai essayé en passant par les liens suivants
Comment câbler dans un collaborateur dans un Maillot de ressources?
et
Accéder à des objets externes dans Maillot de classe de Ressource
Mais encore, je suis incapable de trouver un exemple de travail, qui montre comment les injecter dans une classe de Ressource.
Je ne suis pas à l'aide de Printemps ou un conteneur web.
Ma Ressource est
package resource;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/something")
public class Resource
{
@MyResource
Integer foo = null;
private static String response = "SampleData from Resource";
public Resource()
{
System.out.println("...constructor called :" + foo);
}
@Path("/that")
@GET
@Produces("text/plain")
public String sendResponse()
{
return response + "\n";
}
}
Mon Fournisseur est
package resource;
import javax.ws.rs.ext.Provider;
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;
@Provider
public class MyResourceProvider implements InjectableProvider<MyResource, Integer>
{
@Override
public ComponentScope getScope()
{
return ComponentScope.PerRequest;
}
@Override
public Injectable getInjectable(final ComponentContext arg0, final MyResource arg1, final Integer arg2)
{
return new Injectable<Object>()
{
@Override
public Object getValue()
{
return new Integer(99);
}
};
}
}
Mon EndpointPublisher est
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory;
class EndpointPublisher
{
public static void main(final String[] args)
{
final String address = "http://localhost:8080/";
final Map<String, String> config = new HashMap<String, String>();
config.put("com.sun.jersey.config.property.packages", "resource");
try
{
GrizzlyWebContainerFactory.create(address, config);
System.out.println("server started ....." + address);
callGet();
}
catch (final Exception e)
{
e.printStackTrace();
}
}
public static void callGet()
{
Client client = null;
ClientResponse response = null;
client = Client.create();
final WebResource resource =
client.resource("http://localhost:8080/something");
response = resource.path("that")
.accept(MediaType.TEXT_XML_TYPE, MediaType.APPLICATION_XML_TYPE)
.type(MediaType.TEXT_XML)
.get(ClientResponse.class);
System.out.println(">>>> " + response.getResponseDate());
}
}
Mon annotation étant
@Retention(RetentionPolicy.RUNTIME)
public @interface MyResource
{}
Mais quand j'execute mon EndpointPublisher je ne suis pas en mesure d'injecter de toto!!
OriginalL'auteur su_ | 2011-11-02
Vous devez vous connecter pour publier un commentaire.
Votre InjectableProvider n'est pas correctement mis en œuvre. Le deuxième type de paramètre ne doit pas être le type de champ que vous essayez de piquer au lieu de cela, il devrait être le contexte de java.lang.de réfléchir.Type de classe ou de com.soleil.jersey.l'api.de modèle.Paramètre de la classe. Dans votre cas, vous devez utiliser le Type. Donc, votre InjectableProvider mise en œuvre doit se présenter comme suit:
Il y a une classe d'assistance pour par demande injectable fournisseurs (PerRequestTypeInjectableProvider) ainsi que singleton injectable fournisseurs (SingletonTypeInjectableProvider), de sorte que vous pouvez simplifier un peu en héritant de:
Noter que pour ces classes d'aide de la deuxième paramètre de type est le type du champ.
Et encore une chose - l'injection se produit après le constructeur est appelé, donc le constructeur de votre ressource encore imprimer
...constructor called :null
, mais si vous changez votre méthode pour retourner foo, vous verrez la réponse que vous obtiendrez sera 99.OriginalL'auteur Martin Matula
Cette solution fonctionne bien et je voulais partager ce que j'ai trouvé pour permettre CDI sur le maillot des ressources.
Ici est la plus simple haricot jamais :
Dans votre classe de ressource, nous avons juste injecter cette fève, comme nous le ferions dans un contexte normal :
Et c'est là la clé. Nous définissons un Maillot "InjectionProvider" qui sera responsable des haricots " résolution :
InjectableProvider est tapé avec le type de l'annotation, nous sommes la manipulation, et le type de contexte (ici, normal type java)
ApplicationBeans est juste une simple aide pour les haricots résolution. Voici son contenu :
Espère que cela aidera ceux qui veulent activer CDI injection dans leur Maillot de ressources.
Bye !
OriginalL'auteur Louis GRIGNON