背景NoSuchMethodException - 方法的返回類型已經改變 - 要接受這兩種類型
我有一個公共圖書館,我需要更新。這個公共庫有一個第三方依賴項(jgroups),它在新版本中發生了顯着變化。通過傳遞依賴關係,有時需要更新版本的jgroups,這會打破公共庫。我需要更新一些類以與新版本兼容,同時保持向後兼容性。
的問題
的JGroups提供View
類,它有一個方法getMembers()
。在舊版本(2.10.0)中,此方法返回Vector<Address>
,而在較新版本(3.2.7)中,返回List<Address>
。任何java.util.Collection
的實施都適用於我,但問題是我得到NoSuchMethodException
。據我所知,getMembers()
找到的方法具有傳統的Vector<Address>
返回類型(基於commons庫中的JGroups依賴項),但我拖入新的JGroups版本,View
類預計從getMembers()
方法返回的List<Address>
。
堆棧跟蹤
我開始了我在Eclipse的應用程序時出現以下錯誤。
Caused by: java.lang.NoSuchMethodError: org.jgroups.View.getMembers()Ljava/util/Vector;
at com.mycompany.commons.messaging.events.impl.distributed.JGroupsEventDistributionProvider$JGroupsEventReceiver.viewAccepted(JGroupsEventDistributionProvider.java:136) ~[classes/:na]
at org.jgroups.JChannel.invokeCallback(JChannel.java:752) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
at org.jgroups.JChannel.up(JChannel.java:710) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:1020) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
at org.jgroups.protocols.pbcast.FLUSH.up(FLUSH.java:466) ~[jgroups-3.2.7.Final.jar:3.2.7.Final]
....
當它打破
Collection<Address> viewMembers = view.getMembers();
問題
是否可以支持兩個版本,即使它們的Collection
不同的實現?我如何處理這種情況,直到運行時我才知道方法的返回類型?
注:
我曾試圖排除JGroups的舊版本正在由我的Maven POM文件添加排除拉入。這沒有奏效。
<dependency>
<groupId>com.mycompany.commons</groupId>
<artifactId>mycompany-commons-event-distributed-jgroups</artifactId>
<!-- Note: JGroups dependency is provided by infinispan -->
<version>1.0.2-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.jgroups</groupId>
<artifactId>jgroups</artifactId>
</exclusion>
</exclusions>
</dependency>
更多的解決方法的黑客解決方法 - 但如何提供自己的實用工具方法,並調用'getMembersRaw()'來代替。這將返回底層數組 - 因此您需要將這些值複製到集合中以防止意外修改。 http://www.jgroups.org/javadoc/org/jgroups/View.html#getMembersRaw-- – deyur
@deyur,感謝您的建議。不幸的是,getMembersRaw()在我的JGroups版本中不可用,2.10.0或3.2.7 –
如何使用反射? Field View.members是2.10.x中的Vector
和3.x中的Address []數組。您可以訪問字段View.members,並根據其類型返回所有成員作爲地址集合。不好,但應該工作... –