Spring-WS: автоматическая генерация / сопоставление ошибок wsdl - PullRequest
2 голосов
/ 27 июля 2011

Я использую DynamicWsdl11Definition в spring-ws для генерации моей спецификации wsdl.В конце концов, я получаю спецификацию без ошибок wsdl, связанных с операциями wsdl, поскольку я не знаю, как автоматически связать конкретные операции wsdl / soap с конкретными ошибками wsdl.Как я могу это сделать?Есть ли способ связать ошибки wsdl с операциями wsdl в схеме XSD?

Вот часть из моего XSD:

    <xs:element name="setContextRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="usageContext" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="setContextResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

Вот мое исключение:

    <xs:element name="InvalidSessionException">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="InvalidSessionException" nillable="true" type="fault:InvalidSession"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

Вот спецификация WSDL:

        <wsdl:operation name="setContext">
            <soap:operation soapAction=""/>
            <wsdl:input name="setContextRequest">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="setContextResponse">
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>

Мой вопрос состоит в том, как связать ошибку с этой операцией, чтобы в итоге получить:

        <wsdl:operation name="setContext">
            <soap:operation soapAction=""/>
            <wsdl:input name="setContextRequest">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="setContextResponse">
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="invalidSession" type="InvalidSession"/>
        </wsdl:operation>

Спасибо.

ps: я устанавливаю requestSuffix, responseSuffix и faultSuffix, поэтому могу генерировать сообщения об ошибках wsdl.

Ответы [ 3 ]

4 голосов
/ 04 октября 2011

К первому вопросу о том, как получить sws: dynamic-wsdl для генерации элемента error, условием является то, что элемент fault должен заканчиваться на «Fault», поэтому, если у вас есть «MemberService», используйте «MemberRequest»Элементы "," MemberResponse "и" MemberFault "в вашем xsd, и они будут собраны Spring-WS

<wsdl:portType name="MemberDetails">
  <wsdl:operation name="MemberDetails">
   <wsdl:input message="tns:MemberDetailsRequest" name="MemberDetailsRequest"></wsdl:input>
   <wsdl:output message="tns:MemberDetailsResponse" name="MemberDetailsResponse"></wsdl:output>
   <wsdl:fault message="tns:MemberDetailsFault" name="MemberDetailsFault"></wsdl:fault>
 </wsdl:operation>
</wsdl:portType>

По второму вопросу, как заставить Spring-WS заполнить этот элемент ошибки, янаписал собственный SoapFaultExceptionResolver, который ищет исключение для моего конкретного типа и заполняет тег элемента неисправности тегом.Немного хакерский, но другого пути я не видел.

0 голосов
/ 06 мая 2016

вы должны установить одинаковые имена с разными запросамиSuffix responseSuffix и faultSuffix:

    <xs:element name="setContextRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="usageContext" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="setContextResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="setContextException">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="InvalidSessionException" nillable="true" type="fault:InvalidSession"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
0 голосов
/ 04 октября 2011

Я не смотрел на генерацию встроенных ошибок с помощью динамического WSDL-генерирования.

Я уже использовал EndpointExceptionResolver. Это создаст сообщение SOAP-FAULT. Вы можете определить один из них так:

@Bean
public EndpointExceptionResolver exceptionResolver() {
    SoapFaultDefinition defaultFault = new SoapFaultDefinition();
    defaultFault.setFaultCode(SoapFaultDefinition.SERVER);

    Properties mappings = new Properties();
    mappings.put("com.sun.xml.wss.impl.WssSoapFaultException", "CLIENT,Authentication failed");
    mappings.put("org.springframework.ws.soap.security.xwss.XwsSecurityValidationException", "CLIENT,Authentication failed");

    SoapFaultMappingExceptionResolver resolver = new SoapFaultMappingExceptionResolver();
    resolver.setDefaultFault(defaultFault);
    resolver.setExceptionMappings(mappings);

    return resolver;
}

Вы можете добавить этот обработчик исключений в один из ваших перехватчиков.

...