如何捕获 SOAP Webservice 方法中的任何异常?

2024-03-24

我提供一个SOAP @WebMethod using Spring and CXF。我想捕获任何异常(已检查和未检查)并将它们转换为自定义@WebFault.

我可以以某种方式为我的错误处理程序/拦截器分配一个错误处理程序/拦截器吗?@WebSerivce类,这样我就不必提供额外的try-catch为每个 Web 服务方法阻止?

<jaxws:endpoint implementor="de.MyService" address="/MyService" />

@Component
@WebService
public class MyService {
    @WebMethod
    public void test() throws MyException {
        try {
            service.run();
        } catch (Exception e) {
            throw new MyException("test");
        }
    }
}


@WebFault
public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

因此,使用某种拦截器,我的方法将如下所示:

    @WebMethod
    public void test() {
        service.run();
    }

那可能吗?


好吧,第一个可能建议采用“低技术”方法:为所有处理 Web 服务的基类try/catch in a invoke方法。将此方法委托给抽象doInvoke方法,并使其成为所有 JAXWS 实现仅调用的策略invoke.

@kan涉及AOP的解决方案也肯定是一个可能的解决方案。


但是,如果您想构建自定义错误拦截,则可以在 CXF 级别执行此操作。

当与 JAX-WS 一起使用时,最简单形式的 CXF 可以被视为围绕 JAX WS 引擎的(复杂)拦截器链:拦截器链是 CXF 的所有“内容”所在的地方。

CXF 拦截器被排列成链(“in”链、“in failure”链、“out”和“out failure”链)。

每个链都有不同的“阶段”,例如:RECEIVE, (PRE/USER/POST)_STREAM, READ, (PRE/USER/POST)PROTOCOL, UNMARSHAL, (PRE/USER/POST)LOGICAL, PRE_INVOKE, INVOKE, POST_INVOKE是传入链的默认阶段。

拦截器“按顺序”执行(阶段与优先级相关联,拦截器实现声明它们属于哪个阶段。在阶段内,每个拦截器可以选择放置在某个其他拦截器类之前或之后)。

对于您的情况来说,最重要的是ServiceInvokerInterceptor,属于INVOKE阶段,负责调用@Webservice。当处理“in”链中的所有拦截器时,CXF 将响应对象处理到“out”链以序列化输出(或者如果您有单向 SOAP 方法,则停止此处的所有内容,这是一种特殊情况)。

如果标准链中的任何地方发生异常,CXF 将做两件事:

  1. 它将停止链,并使用handleFault方法调用所有已按相反顺序处理的拦截器
  2. 然后它将控制转发到故障拦截器链(“故障中”、“故障外”)。

因此,添加自己的 SOAP 错误“捕获所有”错误处理的一种可能方法是使用基于此生命周期的拦截器。

您创建一个拦截器实现(AbstractSoapInterceptor 对此很有用) 您将其绑定到 INVOKE 阶段,在ServiceInvokerInterceptor

public class YourInterceptor extends AbstractSoapInterceptor {
    public YourInterceptor() {
        super(Phase.INVOKE);
        addBefore(Arrays.asList(ServiceInvokerInterceptor.class.getName()));
        // This means handleMessage will be called juste before your @WebMethod
        // If it fails, you will be the first to be noticed through #handleFault()
    }
}

当“正常消息通过”时,该拦截器不会执行任何操作:

@Override
public void handleMessage(SoapMessage message) throws Fault {
    // Do nothing
}

但它是为了处理故障:

@Override
public void handleFault(SoapMessage message) {
    // Every exception will be wrapped into a Fault object by CXF
    Fault f = (Fault) message.getContent(Exception.class);
    // You should inspect its g.getCause() to maybe identify what went wrong
    // A CXF Fault also much ressembles a SOAPFault element
    f.setMessage("Your SOAP Fault message");
    // You can access the DOM detail of the fault
    Element detail = f.getOrCreateDetail();
    Element newDetailEntry = detail.getOwnerDocument().createElementNS("detailNs", "detailName");
    newDetailEntry.setTextContent("Content for your soap fault detail");
    detail.appendChild(newDetailEntry);
    // And so on. f.setFaultCode(qName);...
}

另一种实现方式是交换原来的Fault按习俗SoapFault,它也是一个子类Fault,如果它对你来说更有意义。

诚然,这比启动您自己的异常更困难,但它允许您构建精确的、有意义的肥皂故障。但请注意,最好只启动作为 WSDL 一部分存在的 SOAP 错误,因此为了与客户端“良好”地合作,不要在此处构建与您的 WSDL 不匹配的错误(在您的情况下,@Webfault定义)。

最后,您必须声明要添加到链中的拦截器。有多种方法可以做到这一点:在每个 bean 的基础上:

<bean id="myIt" class="com.yourInterceptor" />
<jaxws:endpoint implementor="de.MyService" address="/MyService">
    <jaxws:inInterceptors>
      <ref bean="myIt"/>
    </jaxws:inInterceptor>
</jaxws:endpoint>

或者在总线级别。

<cxf:bus>
    <cxf:inInterceptors>
        <ref bean="myIt"/>
    </cxf:inInterceptors>
</cxf:bus>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何捕获 SOAP Webservice 方法中的任何异常? 的相关文章

  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • 如何检查字符串是否具有特定模式[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 用户输入任意字符串 程序会区分该字符
  • 按对象值分组,统计后按最大对象属性设置组键

    我设法使用 Java 8 Streams API 编写了一个解决方案 该解决方案首先按对象 Route 的值对列表进行分组 然后计算每组中的对象数量 它返回一个映射 Route gt Long 这是代码 Map
  • Selenium - 保存网站,包括所有图像、css、dom

    我想使用 firefox 或 chrome 访问带有 selenium 的页面 当页面加载时 我想从页面下载所有图像 css dom 我想存储每张图像 就像我在其中找到它们一样 chrome gt Tools gt Development
  • 如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录

    我目前正在尝试跨多个基于 JVM Grails Servlet 的 Web 应用程序实现单点登录解决方案 这些应用程序目前都部署在同一个 servlet 容器 当前是 Tomcat 但不想将我的解决方案仅限于 Tomcat 中 所有 Web
  • @NotNull.List 的目的

    当我查看标准时限制条件 http docs oracle com javaee 6 api javax validation constraints package summary html在 Bean Validation API JSR
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 在 javafx 中注册鼠标处理程序,但处理程序不是内联的

    我有一个 JavaFX 应用程序变得有点大 我想保持代码的可读性 我有一个折线图 我希望内置缩放功能 该功能在单击鼠标时发生 我知道我需要向图表注册鼠标侦听器 我无法从 Oracle 示例中弄清楚什么 即如下所示 http docs ora
  • 为什么 Java 中的 hashCode() 可以对不同对象返回相同的值?

    引用我正在读的书中的一段话首先Java http www amazon co uk Head First Java Kathy Sierra dp 0596009208 关键是 哈希码可以相同 但不一定保证对象相等 因为使用的 哈希算法 h
  • Spring @Value 添加验证小于

    我使用以下属性值注入 我如何向此操作添加小于验证 我的意思是我想设置一个验证user maxpassiveday可以说 财产价值不得低于 100 Value user maxpassiveday int maxpassiveday 使用Sp
  • 用于测试的嵌入式 H2 数据库的 Spring 配置

    使用 Spring 进行集成测试的配置是什么样的 嵌入式 h2 数据源 http www h2database com html main html以及可选的 JUnit 我第一次尝试单连接数据源 http static springsou
  • 如何在 Ivy 中使用不同的分类器下载多个 Maven 依赖项?

    我试图依靠Neo4j 服务器 jar http repo neo4j org content repositories snapshots org neo4j app neo4j server 1 5 SNAPSHOT neo4j serv
  • 使用 spring-data-cassandra 的用户定义类型

    我希望创建如下模型 如何在 spring data cassandra 中使用用户定义的类型 email email protected cdn cgi l email protection name fname First lname L
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • 有时 Properties.load() 会跳过行

    在以下情况下 Properties load 会跳过 InputStream 的第二行 这是 Java 的错误还是正常行为 public class PropTest public static void main String args
  • Spring Boot如何加入自定义查询

    我需要创建一个端点 该端点按州返回人口普查数据以及城市列表 我目前使用两个端点来获取此数据 目前回应 自定义查询一 censusByState id 1 code 11 name Rond nia statePopulation 18152
  • 如何将多部分文件从另一个服务发送到一个服务

    我有两个端点 api 它们是 uploadand 重定向 upload是我直接上传文件的地方 重定向是我接收文件并将其传递给上传并获取 JSON 响应的地方 upload 所以下面是我的代码 package com example impo
  • 如何确保超类的子类方法的线程安全?

    我参加了一次面试 并被要求为以下要求设计一个课程 假设我有一个 A 类 它可以有任意数量的子类 即子类 类 A 有一个名为 doSomething 的方法 该方法是同步的 要求是 A 的所有子类都是强制性的重写 doSomething me
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter

随机推荐

  • CSS Sprites 在 IE 中不起作用[8/7/6]

    我正在尝试 CSS 使用精灵来动画我的风险矩阵 它在 Firefox 和 Chrome 中工作得很好 但图像不会显示在 IE 中 代码如下 不想将整个内容粘贴到此处 但摘录显示了模式 dl dd a a dd dd a a dd dl
  • 隐藏文件夹 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 获取不包括隐藏文件的文件列表 https stackoverflow com questions 2418270 c get a list of files excluding those tha
  • android 背景重复-y

    我有一个图像 我想将其放置在右侧并在 y 轴上重复它 HTML 中类似于 背景 url img png 右重复 y 在android中可以做到这一点吗 当我将此位图设置为背景时 它不在右侧
  • 检查 FTP 服务器上的可用空间

    我正在运行一个构建脚本 其中三个可执行文件 每个 100mb 被上传到 FTP 服务器 由于 FTP 服务器空间问题 第一次上传可能会失败 因此我们的构建过程会失败 这意味着我必须从服务器释放一些空间并再次运行构建脚本 这是浪费时间 我想在
  • Python 子模块在 python 3.7 中正确导入,但在 3.6 中则不然

    我的目录结构如下 test init py m1 init py f1 py f2 py test init py是空的 test m1 init py包含一行import test m1 f1 test m1 f1 py包含一行impor
  • 如何将复杂对象传递到 ASP.NET MVC 中的另一个视图?

    我正在尝试将一个复杂的对象 可以序列化 如果有帮助的话 传递给另一个视图 目前 这是我在某些控制器方法中拥有的代码 User user New User Name Fred Email xxxx return RedirectToActio
  • 为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器?

    当我们有一个支持某种形式的多线程的 CPU 时 每个逻辑 CPU 都有它自己的一组寄存器 至少 包括 CR3 寄存器 由于我们在执行不同线程时正在处理同一进程的虚拟地址空间 并且永远不会发生上下文切换 切换同一进程的线程时TLB缓存也不会失
  • conda环境安装后无法导入包

    我尝试安装gdal我的 conda 环境中的包 我激活了 gcpy 环境并使用安装了 gdal 包conda install c conda forge gdal 该软件包安装成功 但是 当我尝试导入包时 出现错误 In 1 import
  • .Bool、.so、? 之间的区别所以

    我试图找出上述例程和 if 语句之间的区别 say y Bool say y so say y say so y 会产生不同的结果 到目前为止 对我来说唯一明显的区别是 优先级高于so Bool and so似乎完全是同义词 这是正确的并且
  • Android谷歌地图异步任务添加标记

    我有一张地图 我有一个点数据库 我想在 AsyncTask 中显示数据库中的点 以便在加载点时用户可以在地图上移动 没有太多点 例如 353 等 但当用户更接近 缩放 具有更大标记的地图时 我会重新绘制所有点 当发生重绘时 应用程序冻结了不
  • Icalendar 事件 RSVP 是否有标准和实现

    总结是 我现在正在实现一个事件确认系统 但找不到 ICalendar 回复的正确格式 因此我想知道是否有一个完整的 REPLY 消息的示例 也许还有一个 PHP 库可以包装所有这些消息 现在了解详细信息 我们收到外部电子邮件 包括要求回复的
  • 使用 tidyr 中的收集改变了我的回归结果

    当我运行下面的代码时 一切都按预期进行 install packages dynlm install packages tidyr require dynlm require tidyr Time lt 1950 1993 Y lt c 5
  • WPF:ItemsControl 中的行和列

    我试过把两个孩子ListView and an ItemsControl在行和列中 通过设置网格RowDefinitions and ColumnDefinitions as the ItemsPanel财产 然而 当我输入时 子控件始终与
  • 根据 XSD 验证 XML 时出错

    我有一个简单的 XML 文件 我想根据 XSD 对其进行验证 当我使用一些随机验证器进行验证时 我总是收到以下错误 发现从元素 Entities 开始的无效内容 预期为 Entities 之一 这是 XML
  • 如何确定与 read.fwf 一起使用的正确文件编码(或使用解决方法来删除不合格的字符)

    我尝试了以下问题中的方法 但仍然陷入困境 如何检测 read csv 的正确编码 https stackoverflow com questions 4806823 how to detect the right encoding for
  • 如何保护资产文件夹中的数据库 sqlite(通过加密)?

    我有过逆向工程的经验 人们可以在android中安静流畅地访问你的数据库 我想知道有什么方法可以在创建时仅对我的数据库进行加密 而不是混淆整个apk 然后在运行时我将使用我的数据库 我对数据库的了解较少 因此任何建议都有助于保护资产文件夹中
  • 防止 LISP 中的终端输出

    我想运行一个函数 但不让它在终端中输出结果 例如 set A B 正常返回B在控制台中如下所示 gt gt gt set A B B gt gt gt A B 我不希望它返回任何东西 我仍然希望该函数能够完成它应该做的事情 只是默默地 gt
  • 良好的 javascript 参考 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 什么是一本好的 javascript 书籍或网站 不仅关注语法 而且很好地解释了 javascript
  • ld 链接问题:/usr/bin/ld: 找不到 [libraryname]

    我使用 Qmake 在 Ubuntu 9 10 上构建共享库 此共享库 A 依赖于另一个共享库 B B项目已成功建设 在项目 A 的 pro 文件中 我的 LIBS 变量如下所示 LIBS L datelib bin llibdatelib
  • 如何捕获 SOAP Webservice 方法中的任何异常?

    我提供一个SOAP WebMethod using Spring and CXF 我想捕获任何异常 已检查和未检查 并将它们转换为自定义 WebFault 我可以以某种方式为我的错误处理程序 拦截器分配一个错误处理程序 拦截器吗 WebSe