java - 如何使用 Spring-WS 将异常转换为返回码?

标签 java web-services soap spring-ws jaxb2

我目前在使用 Spring WS 时遇到错误代码和消息的问题。

为方便起见,我们使用带有 JAXB2 绑定(bind)和 @Endpoint 和 @PayloadRoot 注释的 Spring WS 2.0。

我们的端点如下所示:

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

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

我们仅将 soap 用作由 XSD 定义的 POX 消息的薄包装。这也意味着我们使用返回代码和消息而不是错误。

每个响应继承自

<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 错误

归根结底,这些是与使用 Spring WS 的每个 POX web 服务相关的问题。应该如何拦截这些异常并将其映射到响应对象?

但请记住:所有响应对象都略有不同,因为它们都继承自通用对象,但向其中添加了一些独特的可选内容。

最佳答案

一种对我很有效的方法是:

对于 XSD 验证错误,扩展 AbstractValidatingInterceptor 以提供对 XSD 验证错误的自定义处理,并将其设置为 Spring 上下文中的 validatingInterceptor bean。

对于格式错误的 XML,扩展 MessageDispatcherServlet。覆盖 doService 以捕获 DomPoxMessageException,并在捕获该异常时添加您自己的自定义处理。在 web.xml 中将自定义的 MessageDispatcherServlet 设置为 spring-ws servlet。

我已经在我的博文中用令人作呕的细节写了这篇文章:

http://www.dev-garden.org/2011/09/03/handling-pox-errors-in-spring-ws-part-1/

-拉里

关于java - 如何使用 Spring-WS 将异常转换为返回码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207303/

相关文章:

java - 减少和增加 float 增量android

java - REST ajax 请求每 5 分钟调用一次 |网络逻辑

java - 如何使用 apache.cxf java 从响应信封中提取 soap header

java - 如何为 SOAP 调用设置超时

php - 使用 PHP 使用重复键进行 SOAP 调用

java - 使用 JButtons 的战舰

java - 关系数据未存储在 Ebean 中

java - 在 Java 程序上保留一个类是一个好方法吗?

java - ReSTLet 使用 post web 服务,添加 json 字符串作为表示

java - Spring RequestBody Mapping 将所有属性映射为 null 值