标签:java soap web-services apache-camel soapfault
我创建了一个proxy-camel,它接受SOAP(通过HTTP)和RESTful请求,并将它们转发到正确的Web服务. Camel不知道消息结构,它不知道WSDL或任何东西,它根据http头只知道它是否是SOAP.没有CXF端点.
此外,它做了一些处理.例外情况可能发生在那里,例如,当找不到服务或网址无效时.
有没有一种简单的方法可以直接从这个驼峰返回有效的SOAPFault?
我试着编写一个名为onException的简单处理器.它看起来像这样:
.choice().when().header("SOAP").processRef(ExceptionToSoapProcessor())
应该将任何Exception转换为SOAPFault的处理器如下所示
@Override
public void process(Exchange exchange) throws Exception {
Exception exception = (Exception) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
Integer responseCode = (Integer) exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE);
QName qName = SoapFault.FAULT_CODE_SERVER;
if (responseCode != null && responseCode < 500) {
qName = SoapFault.FAULT_CODE_CLIENT;
}
SoapFault fault = new SoapFault(exception.getMessage(), qName);
Message outMessage = exchange.getOut();
outMessage.setHeader(Message.RESPONSE_CODE, 500);
outMessage.setFault(true);
outMessage.setBody(fault);
exchange.setException(null);
exchange.removeProperty(Exchange.EXCEPTION_CAUGHT);
exchange.setProperty(Exchange.EXCEPTION_HANDLED, true);
}
但现在我不明白我将如何编组它,响应看起来像这样:
org.apache.cxf.binding.soap.SoapFault: Unauthorized
(“未经授权”是实际消息)
PS:之前我使用过dataformat SOAP,但如上所述,我在这个Camel中没有任何ServiceInterface.
解决方法:
我会将错误场景的处理移到onException()块.这样,您可以“声明”某些行为,例如将异常标记为已处理.恕我直言使它更清洁.
只返回SOAP错误不会产生有效的SOAP响应.您必须构建完整的消息结构.我认为没有用于文本流的SOAP消息的类型转换器,因此您必须自己编组SOAP响应.
这是我用来完成工作的代码:
<onException>
<exception>java.lang.Exception</exception>
<handled>
<constant>true</constant>
</handled>
<bean beanType="some.package.WSHelper" method="createSOAPFaultServerError" />
</onException>
public static String createSOAPFaultServerError(final Exception cause) {
String result = null;
LOG.error("Creating SOAP fault, hiding original cause from client:", cause);
try {
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
SOAPBody body = message.getSOAPBody();
SOAPFault fault = body.addFault();
fault.setFaultCode("Server");
fault.setFaultString("Unexpected server error.");
Detail detail = fault.addDetail();
Name entryName = envelope.createName("message");
DetailEntry entry = detail.addDetailEntry(entryName);
entry.addTextNode("The server is not able to complete the request. Internal error.");
result = soapMessage2String(message);
} catch (Exception e) {
LOG.error("Error creating SOAP Fault message", e);
}
return result;
}
private static String soapMessage2String(final SOAPMessage message) throws SOAPException, IOException {
String result = null;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
message.writeTo(outStream);
result = new String(outStream.toByteArray(), StandardCharsets.UTF_8);
return result;
}
HTH
标签:java,soap,web-services,apache-camel,soapfault 来源: https://codeday.me/bug/20190528/1170880.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。