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.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) {
}
}
但是如果您使用 CDI 1.0,那么是的,您将需要 beans.xml
。
资源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.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) {
}
}
但是如果您使用 CDI 1.0,那么是的,您将需要 beans.xml
。