将CDI添加到JAX-WS应用程序

时间:2018-09-25 16:48:55

标签: java tomcat jax-rs cdi

我在TomCat V9上有一个可以正常运行的应用程序...

我正在尝试使用最小依赖项...所以我的pom.xml就是这样:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>br.com.brunots.training</groupId>
    <artifactId>only-jaxrs</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <developers>
        <developer>
            <name>Bruno Teofilo da Silva</name>
            <email>bruno@brunots.com.br</email>
        </developer>
    </developers>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>

    <build>
        <finalName>onlyJaxrs</finalName>
    </build>

    <dependencies>

        <!-- This dependency it's only to use ApplicationPath annotation on Tomcat-->
        <dependency>
            <groupId>org.glassfish.jersey.bundles</groupId>
            <artifactId>jaxrs-ri</artifactId>
            <version>2.27</version>
        </dependency>

        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1.1</version>
        </dependency>

    </dependencies>

</project>

所以我只有两个班级...

package br.com.brunots.training.onlyjaxrs;

import javax.ws.rs.ApplicationPath;

@ApplicationPath("rest")
public class Application extends javax.ws.rs.core.Application {

}

然后...

package br.com.brunots.training.onlyjaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("resource")
public class ApplicationResource {

    @GET
    @Path("get/{message}")
    public Response hello(@PathParam("message") String message) {
        return Response.ok("Response OK!\n" + message).build();
    }

}

仅这足以调用URI onlyJaxrs/rest/resource/get/anyString并获得响应Response OK! anyString

现在,我想使用CDI将我的DAO注入我的服务中。因此,我在beans.xml文件夹下创建了一个空的src/main/webapp/WEB-INF

还要创建一个接口(InjectedObject)和一个实现(InjectedObjectImpl),以尝试将其注入到我的ApplicationResource服务中...

@Path("resource")
public class ApplicationResource {

    @Inject
    private InjectedObject injected;

    ...

}

现在,当我尝试调用相同的URI onlyJaxrs/rest/resource/get/anyString并遇到以下错误时。

javax.servlet.ServletException: A MultiException has 3 exceptions.  They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=InjectedObject,parent=ApplicationResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,2029328088)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of br.com.brunots.training.onlyjaxrsandcdi.jersey.ApplicationResource errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on br.com.brunots.training.onlyjaxrsandcdi.jersey.ApplicationResource

通过对Google的一些研究,我发现我需要对pom.xml添加新的依赖项

    <dependency>
        <groupId>org.glassfish.jersey.containers.glassfish</groupId>
        <artifactId>jersey-gf-cdi</artifactId>
        <version>2.14</version>
    </dependency>

现在我收到此错误:

java.lang.AbstractMethodError: org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.initialize(Lorg/glassfish/jersey/internal/inject/InjectionManager;)V
    at org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$null$0(ComponentProviderConfigurator.java:79)
    at java.util.stream.ReferencePipeline$11$1.accept(ReferencePipeline.java:372)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$init$1(ComponentProviderConfigurator.java:80)
    at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:341)
    at org.glassfish.jersey.server.ApplicationConfigurator.createApplication(ApplicationConfigurator.java:122)
    at org.glassfish.jersey.server.ApplicationConfigurator.init(ApplicationConfigurator.java:96)
    at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$0(ApplicationHandler.java:313)
    at java.util.Arrays$ArrayList.forEach(Arrays.java:3880)
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:313)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:282)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:335)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:178)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:370)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1124)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:974)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4829)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5143)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1427)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1417)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:943)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1427)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1417)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:943)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:258)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:682)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)

真的需要这种依赖吗? 我想念什么?

0 个答案:

没有答案