为什么 WELD 会抛出 UnsupportedOperationException,即使我的接口带有默认方法实现?

Why does WELD throw an UnsupportedOperationException even though my interface comes with default method implementations?

几周后 RedHat 发布了 JBoss EAP 7.1.0 所以我开始对我们的应用程序进行一些初步测试(EAR with Model (JPA )、EJB (CDI) 和 Web)。我们最近用的是EAP 7.0.7,所以版本差距比较小。

只用了几秒钟就运行进入了第一个大问题。每当我们尝试调用接口提供的 default 实现时,WELD 现在会抛出 org.jboss.weld.exceptions.UnsupportedOperationException 而没有任何其他消息。 为什么不支持接口的默认实现?

注意:接口实现了这个方法...不是空方法声明!

以下是此类界面的示例:

public interface Feature {
    default boolean desiresNewConversation() {
        return false;
    }
}

实现该接口的简单 bean:

@Named
public class MyFeature implements Feature, Serializable {
    public String getName() {
        return "Example";
    }
    // Class does NOT override the default method of the interface.
}

UI的简单管理器class:

@Named
public class FeatureManager implements Serializable {
    public void start(Feature f) {
        // ...
    }
    public String propagation(Feature f) {
        return f.desiresNewConversation() ? "none" : "join";
    }
}

以及引用该方法的 xhtml:

<h:form>
    <h:commandButton value="#{myFeature.name}" action="#{featureManager.start(myFeature)}">
        <f:param name="conversationPropagation" value="#{featureManager.propagation(myFeature)}" />
    </h:commandButton>
</h:form>

这将引发以下缩短的堆栈跟踪:

Caused by: org.jboss.weld.exceptions.UnsupportedOperationException: 
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:49)
    at my.package.MyFeature$Proxy$_$$_WeldSubclass.desiresNewConversation(Unknown Source)
    at my.package.FeatureManager.propagation(FeatureManage.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at javax.el.ELUtil.invokeMethod(ELUtil.java:311)
    ... 107 more

这只是一个简单的例子。我正在对接口提供的许多其他默认方法产生这种影响。 WeldSubclass 将不再处理那些对 EAP 7.0.7 和更早版本没有问题的实现。

只要我在 MyFeature 中覆盖该方法,那些异常就消失了。

@Named
public class MyFeature implements Feature {
    public String getName() {
        return "Example";
    }
    @Override
    public boolean desiresNewConversation() {
        return Feature.super.desiresNewConversation();
    }
}

我们的应用程序使用这些默认接口实现中的几个,并且由数百个 classes 实现这些接口组成。 除了完全避免默认接口实现之外,还有什么实用的方法可以解决这个问题吗?

PS:请记住,WeldSubclass 是 WELD 应用的代理,而不是我自己的 class。与合法的 EAP 7.0.7 相比,EAP 7.1.0 的较新 WELD 实现抛出异常。并且甚至没有用任何可能给出该意外更改的某些原因的附加信息来解释该异常。

原来我已经 运行 变成了 https://issues.jboss.org/browse/WELD-2407,这是用 WELD v2.4 解决的。5.Final – EAP v7.1.0 和 v7.1.1 仍然使用 WELD v2.4.3 (redhat).

用 WELD v2.4 修补 EAP v7.1.1。6.Final 解决了。 但不幸的是,我必须等待正式的 EAP 版本。

localhost:JBoss-EAP-7.1 daniel$ bin/jboss-cli.sh 
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /] connect
[standalone@localhost:9990 /] patch apply /Users/daniel/Downloads/wildfly-11.0.0.Final-weld-2.4.6.Final-patch.zip --override-all
{
    "outcome" : "success",
    "response-headers" : {
        "operation-requires-restart" : true,
        "process-state" : "restart-required"
    }
}
[standalone@localhost:9990 /]