在Glassfish 3.1上部署时,在战争中使用的库中使用依赖项注入(使用CDI/Weld)时遇到了问题。我有两个图书馆,比如:
WEB-INF/lib/library1.jar
WEB-INF/lib/library2.jar
library1包含一个公共类,比如"InjectMe"。Library2包含另一个公共类,比如"InjectionTarget",其注入站点类似于"@Inject-public InjectMe-InjectMe;"。
部署失败:
WELD-001408 Unsatisfied dependencies for type [InjectMe] with qualifiers [@Default] at injection point [[field] @Inject packagename.InjectionTarget.injectionSite].
这两个档案都是带有META-INF/beans.xml.的有效CDI档案
我已经在Glassfish 3.1中更新了weld-osgi-bundle.jar,但仍然看到了这个问题。
如果我手动解压缩library1和library2,将它们的类直接放入WEB-INF/classes中,则部署成功,注入工作正常。
这很快就把我逼疯了。我即将重组我的模块,以便使用maven依赖插件来解包jar子包,并将其归档为一个合并的jar,然后我就可以从战争中依赖它了。不过这很可怕。
想法?这不应该"只是工作"吗?
也许你遇到了这个bug?
https://issues.jboss.org/browse/WELD-846
http://java.net/jira/browse/GLASSFISH-15721
http://java.net/jira/browse/GLASSFISH-15735
我认为Glassfish 3.1.1-b04和更新版本使用Weld 1.1.1.Final,它被标记为潜在Weld错误的修复版本。用那个确切的版本进行测试可能足以证实这一点。
这是PEBKAC错误。我在台式机和工作站上更新了weld-osgi-bundle.jar,但没有在笔记本电脑上更新,但我认为我也在笔记本电脑中更新了它。
如果你正在读这篇文章,你可能也有类似的问题。使用检查您的焊接osgi捆绑包版本
asadmin list-modules | grep org.jboss.weld.osgi-bundle
(Windows用户:使用findstr而不是grep,但该命令在其他方面保持不变)。
你应该得到结果:
Module : org.jboss.weld.osgi-bundle:1.1.1.Final
如果您看到旧版本,请根据此处的说明更新weld-osgi捆绑包:
http://seamframework.org/Seam3/CompatibilityHome#H-UpgradingWeldInGlassFish31
即使您不使用Seam,这些说明也适用。Weld 1.1.1修复了CDI中的几个重要错误。我无法理解为什么Glassfish 3.1.2没有与它一起发布,因为它们是重要的修复程序。