无法让CDI和JAX-RS在Glassfish中协同工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法让CDI和JAX-RS在Glassfish中协同工作相关的知识,希望对你有一定的参考价值。

我必须部署一个在Wildfly中成功运行到Glassfish的项目。除了在ResponseFilter中依赖注入对象之外,一切正常。该对象在REST资源处理程序中生成。我创建了一个简单的项目来演示这个问题。我在Stackoverflow上经历了几个答案。尝试了一切,似乎没有工作。

的;

<beans
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    bean-discovery-mode="all">
</beans>

app.Java

@ApplicationPath("api")
public class App extends Application {
}

demo resource.Java

@Path("/demo")
public class DemoResource {

    @Produces
    private Pojo pojo;

    @GET
    public void demo() {
        pojo = new Pojo();
    }
}

PO Jo.Java

@Alternative
public class Pojo {
    protected String firstName;
    protected String lastName;
}

response filter.Java

@Provider
public class ResponseFilter implements ContainerResponseFilter {

    @Inject
    private Pojo injectedPojo;

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException {

        Instance<Pojo> instance = CDI.current().select(Pojo.class);
        Pojo uninjectedPojo = null;
        if (!instance.isUnsatisfied() && instance.get() != null)
            uninjectedPojo = instance.get();
        System.out.println("Injected POJO: " + injectedPojo);
        System.out.println("Uninjected POJO: " + uninjectedPojo);
    }
}

Wildfly日志文件中的输出是:

16:33:58,765 INFO  [stdout] (default task-3) Injected POJO: com.example.demo.Pojo@2092c78b
16:33:58,765 INFO  [stdout] (default task-3) Uninjected POJO: com.example.demo.Pojo@2092c78b

Glassfish日志中的输出是:

[2018-02-14T16:36:37.730+0545] [Payara 4.1] [INFO] [] [] [tid: _ThreadID=27 _ThreadName=http-thread-pool::http-listener-1(3)] [timeMillis: 1518605497730] [levelValue: 800] [[Injected POJO: null]]
[2018-02-14T16:36:37.730+0545] [Payara 4.1] [INFO] [] [] [tid: _ThreadID=27 _ThreadName=http-thread-pool::http-listener-1(3)] [timeMillis: 1518605497730] [levelValue: 800] [[Uninjected POJO: null]]
答案

<alternatives>声明添加到beans.xml

<beans ... >
    <alternatives>
        <class>[package name].Pojo</class>
    </alternatives>
</beans>

或者添加

@Priority(Interceptor.Priority.APPLICATION+100)

Pojo课堂的态度

以上是关于无法让CDI和JAX-RS在Glassfish中协同工作的主要内容,如果未能解决你的问题,请参考以下文章

Shiro / CDI 注入安全主体适用于 Glassfish 但不适用于 Wildfly

在GlassFish 3上为Web应用程序禁用CDI

JAX-RS + JBoss 7.1.1 + RESTEasy:使用 CDI 的 NullPointException

如何在注入 JAX-RS Web 服务的 CDI bean 中获取 HTTP 请求标头?

在glassfish 5 build 25中,CDI bean导致javax.el.PropertyNotFoundException

为啥我的 Glassfish3.1.2.2/MyFaces2.1.9/JSF 管理的性能优于 TomEE1.5+/CDI 管理的性能?