[英]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版,必須啟用beans.xml
才能啟用CDI bean發現。 如果沒有beans.xml
,那么CDI
根本不會在相應的歸檔文件中處於活動狀態。
從CDI 1.1開始, 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.