Vik*_*lva 6 java cdi jersey-2.0
资源类
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
注入:: 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"));
}
}
Run Code Online (Sandbox Code Playgroud)
注入完美适用于包含beans.xml
*的.war\WEB-INF \类\ 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$2.getInstance(CdiComponentProvider.java:245)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189)
Run Code Online (Sandbox Code Playgroud)
任何澄清都有帮助吗?
您的问题的答案取决于 的版本CDI。
对于 1.0 版CDI,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,您可以使用范围注释您的 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) {
}
}
Run Code Online (Sandbox Code Playgroud)
但如果您使用 CDI 1.0,那么您将需要beans.xml.
小智 0
是的,CDI 1.1 需要 beans.xml 文件。
放置它们的位置可能会根据您的包装风格而有所不同。因此,如果您要进行战争,那么 beans.xml 应该存在于 WEB-INF 文件夹中。
对于这个问题为什么重要..
beans.xml 文件在指定位置的存在有助于 CDI 容器进行类路径扫描。
beans.xml 在 Jersey 中是可选的,因为它使用 hk2 进行依赖项注入。但我个人认为 CDI 1.1 比 hk2 更强大,所以我们应该使用 CDI 1.1 或更好的 CDI 2.0(因为它有很多改进)。
如果您好奇,请随时查看 CDI 2.0 示例(不含球衣):https: //github.com/NajeebArif/CDI-2.0-Example
| 归档时间: |
|
| 查看次数: |
1548 次 |
| 最近记录: |