使用Maven的Spring-AOP @Inject仅在发布版本中不起作用

时间:2011-08-11 14:44:47

标签: spring maven aop

我正在使用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。

为了更好地解释,直到昨天我的项目处于SNAPSHOT模式(1.0-ALPHA-2-SNAPSHOT)。来自快照的二进制文件工作。来自1.0-ALPHA-2的二进制文件,发布模式,没有。下一个快照中的二进制文件1.0-ALPHA-3-SNAPSHOT再次工作。唯一的黑洞是释放的二进制文件。看看差异,SNAPSHOT和发布之间没有其他差异,但是模块的版本标签。

到目前为止,我已经排除了问题是由于Maven发布过程中出现了一些奇怪的问题,因为即使我在“普通”版本中从标记源重新创建1.0-ALPHA-2,二进制文件仍然存在错误(也就是说,只需要mvn clean install)。我还使用Java反编译器来查看错误类的有效源(后挥动),比较1.0-ALPHA-2和1.0-ALPHA-3-SNAPSHOT的代码。他们看起来很相似最后,我比较了二进制文件(在Jetty中运行的.war文件),它们包含相同的项目(即没有缺少依赖项,唯一的区别是我的jar文件具有不同的版本)。

我需要一些建议来更好地理解这个错误,因为目前我还不知道还有什么可以尝试。

1 个答案:

答案 0 :(得分:0)

我能够通过将列出的依赖项(以及其他一些)更改为:

来解决这个问题
@Inject @Nonnull
private Provider<Site> site;

Provider是一种注入“懒惰”依赖关系的方法,必须将其延迟为

site.get()

请注意,我已经使用了一些Provider&lt;&gt;过去依赖于我的项目,因为我发现自己有一些无法解决的循环依赖 - 通常Spring会明确地给出关于它们的错误通知。所以这不是我的帖子的完整答案 - 考虑到当运行SNAPSHOT时,不需要这种改变;当项目的不相关细节(例如SNAPSHOT /发布版本)发生更改时,无法解析的循环依赖关系无法解析或解析...

所以我想我在Spring AOP中引发了一些错误。仍然,提供者&lt;&gt;事情完全可以接受。