几天后,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实施引发了例外情况,这是合法的。甚至没有解释任何可能为这种意外变化提供某些原因的其他信息。
答案 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 /]