【发布时间】:2017-04-03 19:39:50
【问题描述】:
我有一个问题我已经有一段时间无法解决了,而且我是 apache camel 的新手,它没有帮助。
我的简单应用使用 CXF(使用码头作为 http 引擎)公开 SOAP Web 服务,然后使用骆驼将肥皂请求传递给 akka 演员。
我想在通往参与者的路上验证 SOAP 请求并检查它是否包含某些标头和内容值。我不想使用 CXF 拦截器。问题是,骆驼中发生的事情(异常,错误消息返回)不会传播到 cxf。我总是得到 SUCCESS 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))
}
当我运行应用程序时,我看到来自 log.info(s"Returning $message") 的日志,所以我确定路由调用处理器,因此也没有调用 actor 行:
exchange.getOut.setFault(true)
exchange.getOut.setBody(message)
做他们的工作。但我的 SOAP 服务仍然返回 202 SUCCESS 而不是错误信息。
【问题讨论】:
标签: scala apache-camel akka cxf