Java 为什么WELD抛出一个不支持的操作异常,即使我的接口带有默认的方法实现?

Java 为什么WELD抛出一个不支持的操作异常,即使我的接口带有默认的方法实现?,java,interface,jboss-weld,Java,Interface,Jboss Weld,几天后,RedHat发布了JBoss EAP 7.1.0,因此我开始对我们的应用程序进行一些初步测试(EAR with Model(JPA)、EJB(CDI)和Web)。我们最近使用了EAP 7.0.7,因此版本差距相当小 只花了几秒钟就遇到了第一个大问题。WELD现在抛出一个org.jboss.WELD.exceptions.UnsupportedOperationException,当我们试图调用接口提供的默认实现时,它不会发出任何附加消息为什么不支持来自接口的默认实现? 注意:接口实现此方

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

只花了几秒钟就遇到了第一个大问题。WELD现在抛出一个
org.jboss.WELD.exceptions.UnsupportedOperationException
,当我们试图调用接口提供的
默认
实现时,它不会发出任何附加消息为什么不支持来自接口的默认实现?

注意:接口实现此方法。。。这不是空的方法声明

以下是此类接口的示例:

实现该接口的简单bean:

UI的简单管理器类:

以及引用该方法的xhtml:

这只是一个简单的例子。我对接口提供的许多其他默认方法产生了这种影响。
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();
    }
}
我们的应用程序使用了几种默认接口实现,并由数百个实现这些接口的类组成除了避免默认接口实现之外,还有什么切实可行的方法来解决这个问题吗?


PS:请记住,
WeldSubclass
是WELD应用的代理,而不是我自己的类。与合法的EAP 7.0.7相比,新的EAP 7.1.0焊接实现引发了例外。甚至没有任何额外的信息来解释例外情况,这些信息可能会给出意外更改的一些原因。

因此,我发现,我遇到了使用WELD v2.4.5.Final解决的问题–EAP v7.1.0和v7.1.1仍然使用WELD v2.4.3(redhat)

用WELD v2.4.6.Final修补EAP v7.1.1解决了问题。但不幸的是,我不得不等待正式的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 /] 

我相信EAP 7.1使用了Weld 2.4.3。您的问题看起来像是代理创建问题,但您所描述的只是一个使用默认方法(
@Named
在代理创建中没有区别)的
@Dependent
bean,这种情况在本地适用。查看那里的堆栈,它提到了
org.jboss.weld.bean.proxy.CombinedInterceptor和DecoratorStackMethodHandler
,我猜您在类中使用了拦截器和/或装饰器。这确实大大改变了代理创建,请更新您的答案以包括所有这些。现在我记得,在Weld 2.4.5.Final发行版中,至少修复了两个代理问题。和。这可能是,也可能不是你遇到的。检查此问题的简单方法-制作一份EAP副本,并尝试将其修补到最新的焊接版本。几天前v7.1.1发布的“WildFly补丁”部分提供了补丁文件的链接和有关如何做的信息。。。我会检查情况是否发生了变化。据我所知,7.1.1中的Weld没有组件升级,因此我非常确定它会再次爆炸。如果你能组装一个简单的复制机,那么创建一个for Weld是值得的,即使是在较新的版本中,这也可能是一个bug(你有没有尝试修补到最新的2.4.x版本来验证这一点?),这基本上取决于你,但是如果你有EAP的订阅,然后,您可以创建一个客户案例,并将其与您的发现(和复制者)一起报告。然后,他们应继续在下一个补片中纳入焊接版本改进。同时,您可以使用自己修补的版本;-)更新:JBoss EAP v7.1.2附带WELD v2.4.7。。。问题正式解决了。
@Named
public class FeatureManager implements Serializable {
    public void start(Feature f) {
        // ...
    }
    public String propagation(Feature f) {
        return f.desiresNewConversation() ? "none" : "join";
    }
}
<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
@Named
public class MyFeature implements Feature {
    public String getName() {
        return "Example";
    }
    @Override
    public boolean desiresNewConversation() {
        return Feature.super.desiresNewConversation();
    }
}
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 /]