gpt4 book ai didi

java - jersey 2.0::for cdi 注入(inject),beans.xml 是必需的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:43 25 4
gpt4 key购买 nike

资源类

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

注入(inject)::记录器类

@Dependent
public final class Loggers {

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

注入(inject)完美地包含 beans.xml 在

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

但是在 jersey 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)

任何澄清都有帮助吗?

最佳答案

您问题的答案取决于 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

关于java - jersey 2.0::for cdi 注入(inject),beans.xml 是必需的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30710360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com