У меня есть несколько проблем с cxf + WSClient в мыле.
Я пишу небольшой инструмент в Grails, который должен делать вызовы SOAP к существующей службе.
WSClient (groovyws-0.5.3-20100521.062225-1.jar) показался идеальным решением моей проблемы. Однако, когда я попытался реализовать вызов одного из действий, у меня возникли две проблемы.
Проблема №1 NullPointerException при вызове некоторых действий.
Я отследил код, который генерирует исключение внутри
AbstractCXFWSClient.invokeMethod(String methodName, Object args)
if (!operationToBeInvoked.isUnwrapped()){
//Operation uses document literal wrapped style.
inputMessageInfo = operationToBeInvoked.getWrappedOperation().getInput();
} else {
inputMessageInfo = operationToBeInvoked.getUnwrappedOperation().getInput();
}
в частности, operationToBeInvoked.getWrappedOperation()
я изолировал код в модульном тесте и обнаружил, что и operationToBeInvoked.getWrappedOperation()
, и operationToBeInvoked.getWrappedOperation()
приводят к нулевым объектам. Я пытался выяснить, что вызывает это, но я думаю, что дошел до конца своих знаний.
Проблема № 2. WSClient.create(String classname) использует ClassNotFoundException (а затем выдает исключение NullPointerException)
В основном, когда я делаю следующий вызов
def event = client.create("com.mypackage.MyBean");
Тот же bean-компонент, который я вижу, просматривая службы из браузера.
<xs:complexType name="myBean">
<xs:sequence>
<xs:element minOccurs="0" name="id" type="xs:long"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="facets" nillable="true" type="tns:beanBean"/>
<xs:element minOccurs="0" name="sortId" type="xs:string"/>
<xs:element minOccurs="0" name="itemId" type="xs:string"/>
<xs:element minOccurs="0" name="preview" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
Я получаю NPE. Когда я углубляюсь, чтобы выяснить, почему я получаю NPE, я обнаруживаю, что это потому, что загрузчик классов в WSClient не может найти «com.mypackage.MyBean», съедает ClassNotFoundException, а затем неизбежно выдает NPE.
Изменить: Должен ли я использовать другой клиент WSClient/cxf? Я действительно хотел избежать необходимости сворачивать свои собственные.....