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

时间:2018-03-05 08:49:34

标签: java interface jboss-weld

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

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

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

以下是此类界面的示例:

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的简单管理器类:

@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();
    }
}

我们的应用程序使用其中几个默认接口实现,并包含数百个实现这些接口的类。 是否有任何实用的方法可以解决这个问题,然后完全避免默认接口实现?

PS :请注意,WeldSubclass是由WELD应用的代理,而不是我自己的类。与EAP 7.0.7相比,EAP 7.1.0的较新WELD实施引发了例外情况,这是合法的。甚至没有解释任何可能为这种意外变化提供某些原因的其他信息。

1 个答案:

答案 0 :(得分:1)

事实证明我遇到了https://issues.jboss.org/browse/WELD-2407,这是用WELD v2.4.5解决的。最终 - EAP v7.1.0和v7.1.1仍然使用WELD v2.4.3(redhat)。

使用WELD v2.4.6修补EAP v7.1.1.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 /]