Throughout life, I cannot get Jersey with hk2 to automatically open annotated @Service classes and introduce them. I tried to follow all the tips for stack overflow, jersey and documentation on hk2 and still no luck. I am trying to introduce a simple echo service to a Jersey resource. The skeleton is created from a simple japp webapp maven archetype that I was trying to expand. This is what I have so far:
pom.xml
<build> <finalName>sandbox</finalName> <plugins> <plugin> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-inhabitant-generator</artifactId> <version>2.3.0</version> <executions> <execution> <configuration> <verbose>true</verbose> </configuration> <goals> <goal>generate-inhabitants</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ... <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.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> </dependency> <dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2</artifactId> <version>2.3.0</version> </dependency> </dependencies>
web.xml
<servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>my.package.jerseytest</param-value> </init-param> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>my.package.jerseytest.application.Application</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
my.package.jerseytest.application.Application
public class Application extends ResourceConfig { public Application() { ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); } }
my.package.jerseytest.service.EchoService
@Service public class EchoService { public String generateResponse(String echo) { return echo; } }
my.package.jerseytest.resource.MyResource
@Path("myresource") public class MyResource { @Inject EchoService echoService; @GET @Produces(MediaType.TEXT_PLAIN) public String getIt() { return echoService.generateResponse("Got it!"); } }
I checked that the inhibitor generator really starts and produces its output, but when starting the Tomcat server getting http://localhost:8080/sandbox/webapi/myresource I get
SEVERE: Servlet.service() for servlet [Jersey Web Application] in context with path [/sandbox] threw exception [A MultiException has 3 exceptions. They are: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=EchoService,parent=MyResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,932014249) 2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of my.package.jerseytest.resource.MyResource errors were found 3. java.lang.IllegalStateException: Unable to perform operation: resolve on my.package.jerseytest.resource.MyResource ] with root cause org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=EchoService,parent=MyResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,932014249)
Any ideas what I am missing? I would be grateful for any help :(
NB! I know about
but they didnβt help me ...