Começando do zero, sem nenhum conhecimento prévio de Jersey 1.x, estou tendo dificuldade em entender como configurar a injeção de dependência em meu projeto de Jersey 2.0.
Também entendo que o HK2 está disponível em Jersey 2.0, mas não consigo encontrar documentos que ajudem na integração com Jersey 2.0.
@ManagedBean
@Path("myresource")
public class MyResource {
@Inject
MyService myService;
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/getit")
public String getIt() {
return "Got it {" + myService + "}";
}
}
@Resource
@ManagedBean
public class MyService {
void serviceCall() {
System.out.print("Service calls");
}
}
pom.xml
<properties>
<jersey.version>2.0-rc1</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jax-rs-ri</artifactId>
</dependency>
</dependencies>
Posso fazer o contêiner iniciar e servir meu recurso, mas assim que adiciono @Inject a MyService, a estrutura lança uma exceção:
SEVERE: Servlet.service() for servlet [com.noip.MyApplication] in context with path [/jaxrs] threw exception [A MultiException has 3 exceptions. They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.noip.MyResource errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.noip.MyResource
] with root cause
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
Meu projeto inicial está disponível no GitHub: https://github.com/donaldjarmstrong/jaxrs
fonte
EntityManager
é, mas a julgar por docs.oracle.com/javaee/6/api/javax/persistence/… parece ser uma interface. Você pode ligá-lo usandobind(EntityManagerImpl.class).to(EntityManager.class)
(que vai ligar uma classeEntityManagerImpl
que implementa a interfaceEntityManager
. Se você precisa usar uma fábrica, dê uma olhadabindFactory()
noAbstractBinder
. Se você precisar de ajuda com isso, crie uma nova pergunta (eu não vai ter espaço para responda nos comentários). Além disso, não tenho certeza se você deve usar @PersistentContext, basta usar @Inject para tudoPrimeiro apenas para responder a um comentário na resposta aceita.
Ele simplesmente lê
bind( implementation ).to( contract )
. Você pode cadeia alternativa.in( scope )
. Escopo padrão dePerLookup
. Então, se você quiser um singleton, você podeTambém há um
RequestScoped
disponívelAlém disso, em vez de
bind(Class).to(Class)
, você também podebind(Instance).to(Class)
, o que será automaticamente um singleton.Adicionando à resposta aceita
Para aqueles que estão tentando descobrir como registrar sua
AbstractBinder
implementação em seu web.xml (ou seja, você não está usando umResourceConfig
), parece que o fichário não será descoberto através da verificação de pacote, ou seja,Ou isso também
Para fazer funcionar, eu tive que implementar um
Feature
:A
@Provider
anotação deve permitir que oFeature
seja captado pela varredura de pacote. Ou sem a verificação de pacote, você pode registrar explicitamente oFeature
noweb.xml
Veja também:
e para informações gerais da documentação de Jersey
ATUALIZAR
Fábricas
Além da ligação básica na resposta aceita, você também tem fábricas, onde pode ter uma lógica de criação mais complexa e também tem acesso para solicitar informações de contexto. Por exemplo
Então você pode injetar
MyService
em sua classe de recursos.fonte
web.xml
mesmo queconfigure()
onHk2Feature
seja chamado, solicitar o recurso lança umNullPointerException
. @PaulSamsothaA resposta selecionada data de um tempo atrás. Não é prático declarar todas as ligações em um fichário HK2 personalizado. Estou usando o Tomcat e só precisei adicionar uma dependência. Embora tenha sido projetado para Glassfish, ele se encaixa perfeitamente em outros recipientes.
Verifique se o seu contêiner também está configurado corretamente ( consulte a documentação ).
fonte
Atrasado, mas espero que isso ajude alguém.
Tenho meu JAX RS definido assim:
Então, no meu código finalmente posso injetar:
No meu caso,
SomeManagedBean
é um bean ApplicationScoped.Espero que isso ajude alguém.
fonte
A Oracle recomenda adicionar a anotação @Path a todos os tipos a serem injetados ao combinar JAX-RS com CDI: http://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm Embora isso esteja longe de ser perfeito ( (por exemplo, você receberá um aviso de Jersey na inicialização), decidi seguir esse caminho, o que me poupa de manter todos os tipos suportados em um fichário.
Exemplo:
fonte
Se preferir usar o Guice e não quiser declarar todas as ligações, você também pode tentar este adaptador:
guice-bridge-jit-injector
fonte
Para mim, funciona sem o
AbstractBinder
se eu incluir as seguintes dependências em meu aplicativo da web (em execução no Tomcat 8.5, Jersey 2.27):Funciona com CDI 1.2 / CDI 2.0 para mim (usando Weld 2/3 respectivamente).
fonte
Dependência necessária para o serviço de descanso de jersey e o Tomcat é o servidor. onde $ {jersey.version} é 2.29.1
O código básico será o seguinte:
fonte