簡體   English   中英

jersey 2.0 ::用於cdi注入,是否必須使用beans.xml?

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

資源類別

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

注入:: 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"));
    }
}

注入可以完美地在以下位置包含beans.xml

* .war \\ WEB-INF \\ classes \\ META-INF \\ beans.xml

但是,球衣2.0中的beans.xml是否不是可選的?

沒有bean.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)

任何澄清是有幫助的嗎?

您問題的答案取決於CDI的版本。

CDI 1.0

對於CDI 1.0版,必須啟用beans.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,則可以使用范圍(通常為@RequestScoped注釋Rest資源:

@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

是,CDI 1.1需要bean.xml文件。

放置它們的位置可能會因您的包裝風格而異。 因此,如果您要打仗,則應該在WEB-INF文件夾中包含beans.xml。

對於這個問題,為什么重要?

bean.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示例(不含球衣)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM