我使用Jboss 7.1.1和Weld 1.1.10。
我有一场包含两个罐子的战争。在api.jar中我有接口,在impl.jar中我有接口的实现。
api.jar文件:
public interface MyInterface {
public void myMethod();
}
impl.jar中:
public class MyClass implements MyInterface {
public void myMethod() {
System.out.println("This is my implementation");
}
}
webapp.war:
public class MyRestApi {
@Inject private MyInterface injected;
@GET public Response doSomething() {
injected.myMethod();
return Response.ok().build();
}
}
现在我想要包含一个MyInterface的装饰器,我将其包含在第三个jar中
decorator.jar:
@Decorator public class MyDecorator implements MyInterface {
@Inject @Delegate @Any private MyInterface delegate;
public void myMethod() {
System.out.println("This is my decorator");
delegate.myMethod();
}
}
我想在decorator.jar中的beans.xml中激活装饰器,但似乎让装饰器工作的唯一方法是在impl.jar中激活它。这不是很实用,因为impl.jar不知道decorator.jar。如果我将来想要包含更多装饰器,或者将相同的装饰器应用于不同的实现呢?
鉴于我仅限于Jboss 7.1.1 atm,并且升级到CDI 1.1不是一个选项,我如何使装饰器独立于实现工作?
这是用于激活装饰器的beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<decorators>
<class>org.company.project.decorator.MyDecorator</class>
</decorators>
</beans>
这是我到目前为止所发现的:如果我把它放在战争中,代替空的,装饰器不会被激活。如果我把它放在decorator.jar中,代替空的那个,装饰器不会被激活。如果我把它放在impl.jar中,代替空的那个,装饰器就会激活。
答案 0 :(得分:0)
您可以在war文件的beans.xml中激活装饰器。
答案 1 :(得分:0)
阅读文档[1]似乎不可能:
您在beans.xml文件中指定的装饰器仅适用于 同一档案中的课程。
因此,您可以将该类放在不同的Jar中,但不能将配置放在其他位置。
[1] https://docs.oracle.com/javaee/7/tutorial/cdi-adv007.htm