jersey 2.0 :: 对于 cdi 注入,beans.xml 是强制性的吗?

jersey 2.0 :: for cdi injection, is beans.xml mandatory?

资源class

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) {
    }
}

注入::记录器class

@Dependent
public final class Loggers {

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

注入完美适用于包括 beans.xml at

*.war\WEB-INF\classes\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.getInstance(CdiComponentProvider.java:245)
        at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189)

任何澄清是否有帮助?

是 beans.xml CDI 1.1 需要文件。

放置它们的位置可能因您的包装风格而异。因此,如果您要 war,那么 beans.xml 应该出现在 WEB-INF 文件夹中。

对于为什么重要的问题..

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

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

如果您好奇,请随时查看 https://github.com/NajeebArif/CDI-2.0-Example

中的 CDI 2.0 示例(不含球衣)

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

CDI 1.0

对于 CDI 的 1.0 版,beans.xml 是启用 CDI bean 发现所必需的。没有 beans.xmlCDI 在相应的存档中根本不活动。

来自 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) {
    }
}

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