Java 当使用可移植扩展修改其对象并在同一对象上应用拦截器时,为什么方法会产生不同的结果?
也许你可以给出一个提示,在哪里找到解决这个问题的方法 目前,我发现了CDI可移植扩展,如这里所示的示例 此CDI可移植扩展从属性文件读取值,并配置Java对象的字段 以下是扩展的一个片段:Java 当使用可移植扩展修改其对象并在同一对象上应用拦截器时,为什么方法会产生不同的结果?,java,cdi,interceptor,Java,Cdi,Interceptor,也许你可以给出一个提示,在哪里找到解决这个问题的方法 目前,我发现了CDI可移植扩展,如这里所示的示例 此CDI可移植扩展从属性文件读取值,并配置Java对象的字段 以下是扩展的一个片段: public <T> void checkForPropertyFileAnnotation( final @Observes ProcessInjectionTarget<T> pit) { AnnotatedType<T> at = pit.g
public <T> void checkForPropertyFileAnnotation(
final @Observes ProcessInjectionTarget<T> pit) {
AnnotatedType<T> at = pit.getAnnotatedType();
if (!at.isAnnotationPresent(PropertyFile.class)) {
return;
}
// found annotation
[...load properties...]
[...assign properties to fields...]
[...create new wrapped InjectionTarget...]
pit.setInjectionTarget([created InjectionTarget]);
}
示例类如下所示:
@Named
@Model // to use EL in jsp/jsf
@Log // the interceptor annotation
@PropertyFile("myprops.txt") // the annotation used within the extension
public class MyProperties {
@Property("version")
Integer version;
@Property("appname")
String appname;
public Integer getVersion() {
return version;
}
public String getAppname() {
return appname;
}
}
结果页面的内容:
<h:body bgcolor="white">
#{myProperties.appname} v#{myProperties.version}
</h:body>
#{myProperties.appname}v{myProperties.version}
这不是真的,扩展可以工作,这意味着它将适当的值注入到所需的字段中,正如我在日志文件中看到的,但是在应用拦截器之后,注入的值就消失了
你知道为什么会这样吗?可能扩展处理的类实例与拦截器不同
谢谢您的回复 在代理类上旋转字段,然后getter从底层实例获取值 我也有同样的问题。拦截器和扩展都是单独工作的,但是当一起使用时,拦截器会停止工作。这是由于OpenWebBeans CDI实现中的一个bug造成的,在该实现中,只有当注入目标是OpenWebBeans特定注入目标的实例时,才会处理拦截器
请参阅:请提供更多信息。你在运行什么容器?我在使用TOME+1.6.0,那又怎样?我应该提供什么更多的信息,以在闪电提示的情况下获得。问题很简单:我将两个默认示例放在一起,每个示例都按照预期的方式工作(扩展工作,拦截器工作),但这两个示例并没有按照预期工作。扩展处理的是另一个实例,而不是拦截器。最好包含链接的基本部分,因为它可能在不久的将来被删除。
<h:body bgcolor="white">
#{myProperties.appname} v#{myProperties.version}
</h:body>