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

也许你可以给出一个提示,在哪里找到解决这个问题的方法

目前,我发现了CDI可移植扩展,如这里所示的示例

此CDI可移植扩展从属性文件读取值,并配置Java对象的字段

以下是扩展的一个片段:

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>