我使用Spring-AOP支持通过@Inject将引用注入到不受Spring beanfactory管理的对象中。例如:
@Configurable(preConstruction=true)
class DefaultContent implements Content
{
@Inject @Nonnull
private Site site;
@Inject @Nonnull
private ModelFactory modelFactory;
public DefaultContent (final @Nonnull FileObject file)
{
resource = modelFactory.createResource(file); // <--here
}我使用的是静态代码编织。
我想我对所有相关的技术都很了解,这确实很好用……在正常的开发周期中(使用Maven)。昨天我准备了一个发行版(使用Maven发布插件),发行版中的二进制文件似乎无法注入,因为我在标记为“here”的行上得到了一个NPE。
为了更好地解释,直到昨天我的项目还处于快照模式(1.0-ALPHA-2- SNAPSHOT )。快照中的二进制文件有效。来自1.0-ALPHA-2,发布模式的二进制文件不起作用。在下一个快照,1.0-ALPHA-3-SNAPSHOT中的二进制文件,可以再次工作。唯一的黑洞是发布的二进制文件。使用diff查看,快照和版本之间没有其他区别,只有模块的版本标签。
到目前为止,我已经排除了问题是由于Maven发布过程中的一些奇怪的事情造成的,因为即使当我在“普通”构建(即,只是mvn干净安装)中从标记的源代码重新创建1.0-ALPHA-2时,二进制文件也是错误的。我还使用了一个Java反编译器来查看错误类的有效源代码(波后处理),比较了1.0-ALPHA-2和1.0-ALPHA-3-SNAPSHOT中的代码。它们看起来一模一样。最后,我比较了这两个二进制文件(在Jetty中运行的.war文件),它们包含相同的项(即,没有丢失依赖项,唯一的区别是我的jar文件具有不同的版本)。
我需要一些建议来更好地理解这个bug,因为目前我不知道还可以尝试什么。
发布于 2011-08-12 02:15:47
我可以通过将列出的依赖项(以及其他几个依赖项)更改为:
@Inject @Nonnull
private Provider<Site> site;提供程序是注入“惰性”依赖项的一种方法,它必须延迟为
site.get()请注意,我已经在过去的项目中使用了一些Provider<>依赖项,因为我检测到了一些无法解析的循环依赖项-通常是Spring显式地给出关于它们的错误通知。因此,这并不是对我的帖子的完整回答-考虑到在运行快照时不需要这种更改;当项目的不相关细节发生更改时,无法解析的循环依赖不可能是不可解析的或可解析的……
所以我想我在Spring AOP中触发了一些bug。尽管如此,Provider<>的事情对我来说是完全可以接受的。
https://stackoverflow.com/questions/7027901
复制相似问题