私はすでにいくつかの時間を解決できないという問題があります。さらに、apache camelの新機能です。CamelからCXF SOAPサービスへの検証例外の受け渡し
私のシンプルなアプリケーションは、CXF(jettyをhttpエンジンとして使用)を使用してSOAP Webサービスを公開してから、soapリクエストがcamelを使用して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))
}
私はアプリを実行すると、私は(s「は$メッセージを返す」)ので、私は、ルートプロセッサを起動すると確信している、また俳優が呼び出されていないlog.infoからログを参照したがって、行:
exchange.getOut.setFault(true)
exchange.getOut.setBody(message)
は仕事をします。しかし、私のSOAPサービスは、障害情報の代わりに202 SUCCESSを返します。
ありがとうございました。これは正確に私が求めていたものではありませんでしたが、あなたのアプローチはさらに優れています。 – dsinczak