5

我已将 CDI 功能添加到server.xml文件<feature>cdi-1.2</feature>中。

我的 Maven 模块包含文件夹内的beans.xml 。<module_name>/src/main/resources/META-INF

这是 beans.xml 内容:

<?xml version="1.0" encoding="UTF-8"?>
<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"
       version="1.1" bean-discovery-mode="all">
</beans>

但是当我使用@Inject注释时它不起作用,我的 bean 总是null.

代码:

package ch.webapp.presentation;

...

@Path("/test/")
public class MyController {
    @Inject
    private MyService myService;

    @GET
    @Path("/foo/{count}")
    @OAuthSecurity(scope = "login")
    @Produces("application/json")
    public Response news(@PathParam("count") int count) {
        return Response
                .ok(myService.getBar(count))
                .build();
    }
}

编辑:

那是我的豆子

package ch.webapp.service;

...

@RequestScoped
public class MyService {
    public String getBar(int count) {
        return "foo";
    }
}

MFPJAXRSApplication我通过扩展类来初始化 jax-rs

package ch.webapp;

...

public class AccountApplication extends MFPJAXRSApplication {
    @Override
    protected void init() throws Exception {
    }

    @Override
    protected void destroy() throws Exception {
    }

    @Override
    protected String getPackageToScan() {
        return getClass().getPackage().getName();
    }
}

环境细节:

Launching mfp (WebSphere Application Server 8.5.5.8/wlp-1.0.11.cl50820151201-1942) on Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_172-b11 (en_CH)

Console Product version: 8.0.0.00-20180717-175523

怎么了?

4

3 回答 3

1

首先,除非您对它们进行适当的注释,否则 websphere jax-rs 实现似乎不会自动集成 jax-rs 资源。

通过适当注释将 jax-rs 置于 CDI 托管上下文中

@Path("/test/")
@javax.enterprise.context.RequestScoped
public class MyController {

    @Inject
    private MyService myService;

    @GET
    @Path("/foo/{count}")
    @OAuthSecurity(scope = "login")
    @Produces("application/json")
    public Response news(@PathParam("count") int count) {
        return Response
                .ok(myService.getBar(count))
                .build();
    }

}

还要确保用于您的服务的注释是 @javax.enterprise.context.RequestScoped

于 2018-08-21T20:10:14.023 回答
0

根据您提供的输入,请查看以下清单。

  1. 你的服务和控制器在同一个模块中,它的包装类型是战争,所以你必须把你的beans.xml放在这个路径src/main/resources/WEB-INF/beans.xml中。(如果这是 Java EE 7 应用程序,则 beans.xml 是可选的。
  2. 在您的 AccountApplication 类中,尝试将包名称硬编码为ch.webapp.presentation

    @Override protected String getPackageToScan() { return "ch.webapp.presentation"; }

这只是为了检查 MFPJAXRSApplication.getPackageToScan() 方法的行为是仅扫描指定的包还是它的子包。

  1. 除了这些,我觉得一切都很好。如果这仍然不起作用,请添加完整的应用程序启动日志,以便社区可以找到它的根本原因。
于 2018-08-29T15:03:18.590 回答
-2

这是经典错误。CDI 适用于托管bean(例如 EJB 和 servlet)。如果您想在您的 JAXRS bean 上启用它,您必须将其设为“托管”,即将 MyController 注释为(例如javax.annotation.ManagedBeanjavax.ejb.Stateless.

另请注意,对于 webapp (.war),beans.xml 文件必须位于 WEB-INF 文件夹中!

于 2018-08-26T17:10:25.073 回答