【发布时间】:2016-07-02 12:12:13
【问题描述】:
我正在尝试找出一种将 bean 注入方面的方法。
我是说
public class Greeter {
public String greet(String name) {....}
}
...
public aspect GreeterAspect {
@Inject
private Greeter greeter
...
}
使用 Arquillian + Wildfly 8.2.1(托管和远程)将其作为 JUnit 测试执行,我得到以下日志行:
WELD-000119: Not generating any bean definitions from x.y.z.Greeter because of underlying class loading error: Type org.aspectj.runtime.internal.AroundClosure from [Module "deployment.test.war:main" from Service Module Loader] not found.
WELD-000119: Not generating any bean definitions from x.y.z.GreeterAspect because of underlying class loading error: Type org.aspectj.lang.NoAspectBoundException from [Module "deployment.test.war:main" from Service Module Loader] not found.
在我收到错误消息后不久
WELD-001474: Class x.y.z.Greeter is on the classpath, but was ignored because a class it references was not found: org.aspectj.runtime.internal.AroundClosure from [Module "deployment.test.war:main" from Service Module Loader].
如果我做对了,它会抱怨 aspectjrt.jar 不在类路径中,尽管我已经检查过并且我在依赖项中得到了它(使用 Maven 构建)。在provided 范围内,尝试切换到compile 但没有任何改变。
谁能帮我解决这个问题?
编辑:解决了最初的问题,现在是 NullPointerException
按照 simas_ch 的建议,通过将 aspectjrt.jar 添加到 Arquillian 部署解决了最初的问题。
虽然,在执行时,我收到了NullPointerException
public class Greeter {
public String greet(String name) {....}
}
...
public aspect GreeterAspect {
@Inject
private Greeter greeter;
private pointcut pc() : execution(* x.y.z.SomeClass.someMethod(..));
String around() : pc() {
log.debug("Aspect is about to say something...");
String result = greeter.greet("Stefano");
log.debug("Aspect said: " + result);
return proceed();
}
}
我可以看到第一条日志行 (Aspect is about to say something...),然后我得到了NullPointerException,显然Greeter bean 没有被注入。
我做错了什么?或者有没有可能将 bean 注入方面?
【问题讨论】:
-
providedscope 表示它是由其他人提供的,例如框架。你检查是不是这样?或者您是否尝试过没有特殊范围,例如将其添加到运行时类路径? -
@Thomas 是的,事实上我试图将其移至
compile,但并没有改变这种情况。您的意思是将 jar 添加到 Wildfly 类路径还是 Arquillian 的? -
你使用收缩包装吗?如果是,则必须添加依赖项: File[] files = Maven.resolver().loadPomFromFile("pom.xml") .importRuntimeDependencies().resolve().withTransitivity().asFile();
-
AFAIK
compile与provided类似,因为它不会添加到应用程序中。如果尝试将其添加到耳朵的 lib 文件夹中(不提供任何范围)。或者为 AspectJ 创建一个模块(可能已经存在一个)并为您的应用程序定义对该模块的依赖项(在 JBoss 7 中,这将在 MANIFEST.MF 或 jboss-deployment-structure.xml 中,不确定是否重命名它在 Wildfly 中)。 -
我不认为你可以在一个方面使用@Inject。这不是一个 Java 类,AspectJ 编织器根据切入点将切面注入到您的 Java 类中。