我对Apache Camel完全不熟悉,在完成“Camel in Action”之后,我仍然不太清楚基本功能。有没有办法在没有用bean方法注入交换的情况下将消息设置为错误消息。
我在这里可以提供一个例子:
class HttpBean{
public void parseIP(@Properties Map properties,@XPath("//ip") String ip){
properties.put("IP", ip);
}
}
名为“parseIP”的方法用于使用xpath解析正文中的ip并将其值保存在属性映射中。但是如果在主体中根本没有ip标签,我想创建一个错误消息并终止进程(不只是抛出一个异常,它将被视为可恢复的错误,这里我想要一个不可恢复的错误)。为了实现这一目标,我可以使用以下代码:
class HttpBean{
public void parseIP(@Properties Map properties,@XPath("//ip") String ip, Exchange exchange){
if(ip == null){
exchange.getIn().setFault(true);
exchange.getIn().setBody("Ip is missing");
}
properties.put("IP", ip);
}
}
但这是最好的解决方案吗?因为一旦我将交换注入bean方法,我认为它与骆驼处理器没有什么不同,我失去了它的大部分优势。骆驼中的bean可以在不使用任何Camel特定API的情况下完成自己的工作,但是一旦注入交换,优势就会消失。
有人可以帮我解决这个问题吗?非常感谢。
答案 0 :(得分:2)
根据bean的结果从路径设置错误...如果属性IP为null,则设置错误等...
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:route1")
.bean(new HttpBean())
.filter(property("IP").isNull()).setFaultBody(constant("Ip is missing")).end()
.to("mock:mock");
}
};
}
public static class HttpBean {
public void parseIP(@Properties Map properties, @XPath("//ip") String ip){
if(ip != null && ip.length() > 0){
properties.put("IP", ip);
}
}
}
答案 1 :(得分:1)
如果有人遇到这个问题并且正在寻找有关如何在POJO,消息或有效负载模式下从CXF设置Soap故障的详细信息,请查看Talend中的此链接:
以下是代码段:
SoapFault fault = new SoapFault("unable to process request", SoapFault.FAULT_CODE_SERVER);
Element detail = fault.getOrCreateDetail();
Document detailPayload = getYourDetailHere();
detail.appendChild(detail.getOwnerDocument().importNode(detailPayload.getDocumentElement(), true));
Message outMessage = exchange.getOut();
outMessage.setHeader(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));
outMessage.setFault(true);
outMessage.setBody(fault);