2015-01-06 3 views
0

У нас есть сеансовый компонент без состояния (EJB 3.0), который имеет метод, который принимает varargs (переменные аргументы) в качестве входных данных. Подпись метода выглядит следующим образом: -EJB вызов метода varargs при отказе от клиента Java7

public String operation1 (String arg1, List ... arg4);

Этот EJB развернут на Weblogic 10.3.2, работающем на JRE Java.

Когда этот метод EJB вызывается из автономного клиента Java6, вызов выполняется успешно. Когда я изменяю JRE с Java6 на Java7 (без изменения какого-либо другого клиентского кода), вызов выходит из строя с помощью немаршального исключения (трассировка стека ниже).

javax.ejb.EJBException: Could not unmarshal method ID; nested exception is: 
    java.rmi.UnmarshalException: Method not found: 'operation1(Ljava.lang.String;Ljava.util.List...;)'; nested exception is: java.rmi.UnmarshalException: Method not found: 'operation1(Ljava.lang.String;Ljava.util.List...;)' 
    at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.unwrapRemoteException(RemoteBusinessIntfProxy.java:109) 
    at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusinessIntfProxy.java:91) 
    at com.sun.proxy.$Proxy5.operation1(Unknown Source) 
    at com.MyEJBStandaloneClient.testOperation1(MyEJBStandaloneClient.java:78) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 

EJB Code

@Stateless(mappedName = "MyBean") 
public class MyBean implements MyBeanRemote{ 

    public String operation1(String arg1,List...arg4) { 
     System.out.println("Input1 is:-"+arg1); 
     return "newString"; 
    } 


} 

Удаленный класс

@Remote 
public interface MyBeanRemote { 
    public String operation1(String arg1,List... arg4); 
} 

Методы без списков параметров (если таковые будут добавлены), в том же EJB успешно вызывается из клиентов Java7 & он является только методы varargs в EJB, которые имеют эту проблему.

Обратите внимание, что тот же самый вызов отлично работает даже с Java7 если сигнатура методы на классе удаленного интерфейса изменяется на следующий

public String operation1(String arg1,List[] arg4); 

Но есть ли способ, чтобы заставить его работать без изменения сигнатуры методы?

Есть ли какие-либо известные проблемы вокруг этого?

Спасибо.

ответ

0

Проблема, которую вы описали, является следствием старой ошибки WebLogic.

Фактически, Методы EJB с использованием varargs игнорируются, когда генерируют его классы-заглушки. Глубокая причина в том, что компилятор WebLogic EJB неправильно пытается добавить модификатор transient к аргументу varargs.
Очевидно, что это приводит к ошибке, и поэтому метод stub не генерируется.

В то время BEA создала путь, CR327275, для WebLogic 10.0.MP1, чтобы исправить проблему. К сожалению, этот патч был, по-видимому, НЕ включен в релиз WebLogic 10.3 ...

Отклики на эту точку не так-то просто найти, но сообщество швов сделало некоторые.Вот они:

Таким образом, чтобы решить вашу проблему:

  • или, как вы уже догадались, вы должны изменить подпись метода
  • или вы связываетесь с WebLogic, чтобы установить и установить прежний патч.

С уважением, Томас

Смежные вопросы