ФоновыхNoSuchMethodException - тип возвращаемого значения изменилось - Хочет принять оба типа
У меня есть библиотека общин, что я должен обновить. Эта библиотека commons имеет стороннюю зависимость (jgroups), которая значительно изменилась в новых версиях. С помощью транзитивных зависимостей иногда требуется более новая версия групп, и это нарушает библиотеку общих ресурсов. Мне нужно обновить некоторые классы для совместимости с более новыми версиями, поддерживая обратную совместимость.
Проблема
JGroups обеспечивает View
класс, который имеет метод getMembers()
. В старой версии (2.10.0) этот метод возвращает Vector<Address>
, а в более новой версии (3.2.7) это возвращает List<Address>
. Любая реализация java.util.Collection
будет работать для меня, но проблема в том, что я получаю NoSuchMethodException
. Как я понимаю, найденный метод getMembers()
имеет прежний тип возврата Vector<Address>
(на основе зависимости JGroups в библиотеке commons), но я перетаскиваю новую версию JGroups и что класс View
ожидает List<Address>
, возвращенный из метода getMembers()
.
StackTrace
Я получаю следующее сообщение об ошибке при запуске моего приложения в 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 ПОМ. Это не сработало.
<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 –
Как насчет использования отражения? Поле View.members - это вектор
в 2.10.x и массив Address [] в 3.x. Вы можете получить доступ к полю View.members и - в зависимости от его типа - вернуть всех членов в виде набора адресов. Не красиво, но должно работать ... –