当前位置: 首页 > 知识库问答 >
问题:

将验证异常从Camel传递到CXF SOAP服务

訾俊名
2023-03-14

我有一个问题,我已经解决了一段时间,加上我是apache camel的新手,它没有帮助。

我的简单应用程序使用CXF(使用jetty作为http引擎)公开SOAP web服务,然后使用Camel将SOAP请求传递给akka参与者。

我希望在通往actor的道路上验证SOAP请求,并检查它是否包含某些头部和内容值。我不想使用CXF拦截器。问题是,camel中发生的事情(异常,错误消息返回)不会传播到CXF。我总是在日志中得到成功202作为响应和关于验证异常的信息。

class RequestActor extends Actor with WithLogger {
  def receive = {
    case CamelMessage(body: Request, headers) =>
      logger.info(s"Received Request $body [$headers]")
    case msg: CamelMessage =>
      logger.error(s"unknown message ${msg.body}")
  }
}

class CustomRouteBuilder(endpointUrl: String, serviceClassPath: String, system: ActorSystem)
  extends RouteBuilder {
  def configure {
    val requestActor = system.actorOf(Props[RequestActor])

    from(s"cxf:${endpointUrl}?serviceClass=${serviceClassPath}")
      .onException(classOf[PredicateValidationException])
        .handled(true)
        .process(new Processor {
        override def process(exchange: Exchange): Unit = {
          val message = MessageFactory.newInstance().createMessage();
          val envelope = message.getSOAPPart().getEnvelope();
          val body = message.getSOAPBody();
          val fault = body.addFault();
          fault.setFaultCode("Server");
          fault.setFaultString("Unexpected server error.");
          val detail = fault.addDetail();
          val entryName = envelope.createName("message");
          val entry = detail.addDetailEntry(entryName);
          entry.addTextNode("The server is not able to complete the request. Internal error.");

          log.info(s"Returning $message")
          exchange.getOut.setFault(true)
          exchange.getOut.setBody(message)
        }

        })
      .end()
      .validate(header("attribute").isEqualTo("for_sure_not_defined"))
      .to(genericActor)
  }
}

object Init extends App {

  implicit val system = ActorSystem("superman")
  val camel = CamelExtension(system)
  val camelContext = camel.context
  val producerTemplate = camel.template

  val endpointClassPath = classOf[Service].getName
  val endpointUrl = "http://localhost:1234/endpoint"

  camel.context.addRoutes(new CustomRouteBuilder(endpointUrl, endpointClassPath, system))

}
exchange.getOut.setFault(true)
exchange.getOut.setBody(message)

共有1个答案

寿伟
2023-03-14

我不确定您在寻找什么,但我以不同的方式处理了CXFendpoint的异常。我必须在SOAPFault中返回带有自定义详细信息的HTTP-500(如验证错误消息等),所以...

>

  • 保持Camel未处理的异常,以将其传递给CXF.onException(classof[PredicateValidationException]).handled(false)

    创建org.apache.cxf.interceptor.fault对象,包含所有需要的异常细节。(不是肥皂错误)。它允许设置自定义详细信息元素,自定义FaultCode元素,消息。

  •  类似资料:
    • 问题内容: 我有类似的服务 我想从控制器做类似 getCurrentPosition可以正常工作,并且城市也已确定,但是我不知道如何在控制器中访问城市。 怎么了? 调用getCurrentCity时,它将调用getCurrentPosition来确定gps坐标。该坐标作为参数传递给onSuccess方法,对吗?因此,这与我要在getCurrentCity方法中执行的操作完全相同,但我不知道如何做。

    • ...下面的类是骆驼处理器,它最终被调用: 我知道Apache CXF使用的Exchange类与Camel使用的Exchange不同,但是这两种集成技术之间应该有一种传递信息的方式?

    • 我有一个.NET应用程序,其中有一个用于接收用户请求的控制器,一个服务调用另一个服务。我在中有一些代码,当用户请求值不正确时,我查询数据库(DynamoDB)并得到500错误的响应。我想处理这个问题,这样我就可以捕捉到这个错误/异常,并将错误消息连同一个400状态码一起从控制器发回给用户。我应该如何修改代码来做到这一点? 这是我尝试过的。目前,我只是在中打印错误,但我需要将其发送到控制器。通过抛出

    • 我正在测试带注释的javax验证。它们在应用程序中工作良好,方法参数上有注释。但是当我试图通过手动构建验证工厂来测试它们时 我得到以下错误。 javax。验证。ValidationException:HV000183:无法初始化“javax”。艾尔。“表达工厂”。检查类路径上是否有EL依赖项,或者改用ParameterMessageInterpolator 收到这个错误后,我在gradle文件中添

    • 当异常被抛出到组播中时,Camel不会传播异常。 在以下设置下,从其beanref引发异常: 为什么我不能向父路由提出多播异常? 骆驼2.17-快照

    • 下面是我的代码: 这里有个例外: 对象“users”中字段“salary”上的字段错误:拒绝值[null];代码[NotNull.Users.Salary,NotNull.Salary,NotNull.java.lang.Integer,NotNull];参数[org.springframework.context.support.defaultmessageSourceResolvable:代码