jersey 2.0 :: for cdi注入,bean.xml是强制性的吗?

Vik*_*lva 6 java cdi jersey-2.0

资源类

public class UploadFileService {

    @Inject public Logger logger;

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) {
    }
}
Run Code Online (Sandbox Code Playgroud)

注入:: Logger类

@Dependent
public final class Loggers {

    @Produces
    public static final Logger getLogger(final InjectionPoint injectionPoint) {
    if (injectionPoint == null) {
        throw new IllegalArgumentException("injectionPoint", new NullPointerException("injectionPoint"));
    }
}
Run Code Online (Sandbox Code Playgroud)

注入完美适用于包含beans.xml

*的.war\WEB-INF \类\ META-INF\beans.xml中

但是它不是在泽西2.0中可选的beans.xml吗?

缺少beans.xml时报告错误

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=Logger,parent=UploadFileService,
qualifiers={},position=-1,optional=false,self=false,unqualified=null,1642832267)
        at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
        at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:947)
        at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:902)
        at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory$2.getInstance(CdiComponentProvider.java:245)
        at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189)
Run Code Online (Sandbox Code Playgroud)

任何澄清都有帮助吗?

Rou*_*boy 5

您的问题的答案取决于 的版本CDI

CDI 1.0

对于 1.0 版CDIbeans.xml必须启用 CDI bean 发现。如果没有beans.xml,CDI在相应的存档中根本不处于活动状态。

从 CDI 1.1 开始

从CDI 1.1开始,beans.xml不再强制。扫描结果如下:

  • 省略 beans.xml 或设置bean-discovery-mode="annotated"会使存档成为隐式存档。在这种情况下,容器将扫描具有带注释的范围类型的 bean。
  • 设置bean-discovery-mode="all",所有类都会被扫描。

因此,在您的情况下,如果您想让 Jersey 2.0 在没有 的情况下工作beans.xml,假设 CDI 版本至少为 1.1,您可以使用范围注释您的 Rest 资源,通常是@RequestScoped

@RequestScoped
public class UploadFileService {

    @Inject 
    private Logger logger;

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) {
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果您使用 CDI 1.0,那么您将需要beans.xml.


小智 0

是的,CDI 1.1 需要 beans.xml 文件。

放置它们的位置可能会根据您的包装风格而有所不同。因此,如果您要进行战争,那么 beans.xml 应该存在于 WEB-INF 文件夹中。

对于这个问题为什么重要..

beans.xml 文件在指定位置的存在有助于 CDI 容器进行类路径扫描。

beans.xml 在 Jersey 中是可选的,因为它使用 hk2 进行依赖项注入。但我个人认为 CDI 1.1 比 hk2 更强大,所以我们应该使用 CDI 1.1 或更好的 CDI 2.0(因为它有很多改进)。

如果您好奇,请随时查看 CDI 2.0 示例(不含球衣):https: //github.com/NajeebArif/CDI-2.0-Example