Как преобразовать исключения в коды возврата с помощью Spring-WS? - PullRequest
8 голосов
/ 17 ноября 2010

В настоящее время у меня проблема с кодами ошибок и сообщениями, использующими Spring WS.

Для удобства мы используем Spring WS 2.0 с привязкой JAXB2 и аннотациями @Endpoint и @PayloadRoot.

Наша конечная точка выглядит следующим образом:

@Endpoint
public class MyEndpoint() {
    private static final String MY_NAMESPACE=...;

    @PayloadRoot(namespace=MY_NAMESPACE, localPart="myPart")
    public MyPartResponse handleMyPart(MyPart myPart) {
        ....
    }
}

Мы используем мыло только в качестве тонкой обертки вокруг сообщения POX, определенного в XSD. Это также означает, что мы используем коды возврата и сообщения вместо ошибок.

Каждый ответ наследуется от

<xs:complexType name="ResultBase">
    <xs:sequence>
        <xs:element name="errorCode" type="tns:ErrorCode" />
        <xs:element name="errorMessage" type="xs:string" />
    </xs:sequence>
</xs:complexType>

и добавляет некоторые особенности в случае успеха, например:

<xs:element name="MySpecificResponse">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="tns:ResultBase">
                <xs:sequence>
                    <xs:element name="mySpecificElement" type="tns:MySpecificType" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

Все исключения, создаваемые в методе handleMyPart , могут быть четко отображены.

Однако два типа ошибок остаются необработанными и генерируют ошибки вместо четкого сообщения об ошибке:

  • Ошибки проверки XSD
  • Неправильные ошибки XML

В конце концов, это проблемы, которые относятся к каждому веб-сервису POX, использующему Spring WS . Как перехватить эти исключения и отобразить их на объект ответа?

Помните: все объекты ответа немного отличаются , поскольку все они наследуются от общего, но добавляют к нему некоторый уникальный необязательный контент.

1 Ответ

5 голосов
/ 17 октября 2011

Один подход, который хорошо сработал для меня, таков:

Для ошибок проверки XSD расширьте AbstractValidatingInterceptor, чтобы обеспечить настраиваемую обработку ошибок проверки XSD, и задайте его как bean-компонент validatingInterceptor в контексте Spring.

Для неправильно сформированного XML расширьте MessageDispatcherServlet. Переопределите doService, чтобы перехватить DomPoxMessageException, и добавьте свою собственную обработку, когда вы перехватываете это исключение. Установите свой собственный MessageDispatcherServlet в качестве сервлета spring-ws в файле web.xml.

Я написал это с подробностями до тошноты в своем блоге здесь:

http://www.dev -garden.org / 2011/09/03 / погрузо-оспа-ошибки в пружине-WS-часть-1 /

-Larry

...