Camel CXF выбрасывает параметры Part {example.com} типа X, а не Y - PullRequest
0 голосов
/ 06 июля 2018

Я новичок в SOAP и не могу понять, в чем проблема. Я посмотрел на аналогичный пост SO , но, к сожалению, это не помогает. Сообщение об ошибке:

WARNING: Interceptor for {http://bbbts/Service}Service#{http://bbbts/Service}ConfirmAStatus has thrown exception, unwinding now
IllegalArgumentException: Part {http://bbbts/Service}parameters should be of type package.ConfirmAStatusResponse, not package.ConfirmAStatus

Я настроил конечную точку в Camel следующим образом:

    CxfEndpoint cxfEndpoint = new CxfEndpoint();
    cxfEndpoint.setAddress("http://0.0.0.0:8888/aaans/services/Service");
    cxfEndpoint.setWsdlURL("Service.wsdl");
    cxfEndpoint.setCamelContext(camelContext);
    cxfEndpoint.setBus(bus);
    cxfEndpoint.setServiceNameString("bbbts:Service");
    cxfEndpoint.setDefaultOperationName("ConfirmAStatus"); 
    cxfEndpoint.setDefaultOperationNamespace("http://bbbts/Service");

    try { 
    cxfEndpoint.setServiceClass("package.Service"); 
    } catch (ClassNotFoundException e1) { 
    } 
    cxfEndpoint.setDataFormat(DataFormat.POJO);  

Я сгенерировал класс Service через cxf-codegen, и он выглядит так:

@WebService(targetNamespace = "http://bbbts/Service", name = "Service")
@XmlSeeAlso({ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface Service {

@WebMethod(operationName = "ConfirmAStatus", action = "http://aaans/2012/nsv1/ConfirmARecallStatus")
@Action(input = "http://aaans/2012/nsv1/ConfirmProductBatchRecallStatus", output = "http://aaans/2012/nsv1/ConfirmAStatusResponse")
@WebResult(name = "ConfirmAStatusResponse", targetNamespace = "http://aaans/2012/", partName = "parameters")
public ConfirmAStatusResponse confirmAStatus(
    @WebParam(partName = "parameters", name = "ConfirmAStatus", targetNamespace = "http://aaans/2012/")
    ConfirmAStatus parameters
);
.... ConfirmBStatusResponse ...

Я унаследовал файл WSDL, и у меня нет опыта использования файлов WSDL, поэтому, пожалуйста, дайте мне знать, какие части будут полезны. Это операция в файле wsdl:

<wsdl:operation name="ConfirmAStatus">
  <wsdl:input wsaw:Action="http://aaans/2012/nsv1/ConfirmAStatus" message="tns:Service_ConfirmAStatus_InputMessage"/>
  <wsdl:output wsaw:Action="http://aaans/2012/nsv1/ConfirmAStatusResponse" message="tns:Service_ConfirmAStatus_OutputMessage"/>
</wsdl:operation>

Я довольно затрудняюсь понять сообщение об ошибке. Тип параметра функции явно имеет тип ConfirmAStatus, а не ... StatusResponse, как указано в сообщении об ошибке. Я попытался добавить пространство имен операции по умолчанию, как упомянуто в другом сообщении SO, но безрезультатно. Я даже не знаю, имеет ли это какое-либо отношение к пространствам имен. Если бы у кого-то был указатель, в каком направлении я мог бы попытаться решить эту проблему, я был бы очень благодарен.

edit: добавление wsdl: часть сообщения

<wsdl:message name="Service_ConfirmAStatus_InputMessage">
  <wsdl:part name="parameters" element="q1:ConfirmAStatus" xmlns:q1="hhttp://aaans/2012/"/>
</wsdl:message>
<wsdl:message name="Service_ConfirmAStatus_OutputMessage">
  <wsdl:part name="parameters" element="q2:ConfirmAStatusResponse" xmlns:q2="http://aaans/2012/"/>
</wsdl:message>

1 Ответ

0 голосов
/ 09 июля 2018

В сообщении об ошибке говорится, что аргумент parameters имеет тип ConfirmAStatus, но должен иметь тип ConfirmAStatusResponse

Поскольку ваша реализация ожидает тип ConfirmAStatus

ConfirmAStatus parameters

Я подозреваю, что определение входного сообщения в WSDL неверно, но эта часть не содержится в вашем вопросе.

Возможно, у вас есть такое определение сообщения

<wsdl:message name="Service_ConfirmAStatus_InputMessage">
    <wsdl:part name="NameOfTheElement" element="ReferenceToTheSchemaElementThatRepresentsThisMessagePart"/>
</wsdl:message>

В этом примере определение XML-схемы ReferenceToTheSchemaElementThatRepresentsThisMessagePart, по-видимому, имеет тип ConfirmAStatus вместо ConfirmAStatusResponse

...