Tôi có một máy chủ JAX-WS SOAPHandler
(trên WebSphere v8) trong một số trường hợp nhất định cần phản hồi với máy khách bằng phản hồi SOAP rằng nó có trong một biến String (hãy gọi nó là responseXml
).SOAPHandler phía máy chủ JAX-WS trả về lỗi được "Lỗi nội bộ" trên WebSphere v8
Khi responseXml
chứa thông báo SOAP thành công (tức là, không có lỗi), JAX-WS gửi phản hồi cho khách hàng chính xác. Tuy nhiên, khi responseXml
chứa một thông điệp lỗi SOAP, một "Internal Error" xảy ra, và khách hàng nhận được một phản ứng lỗi khác với một trong responseXml
, như ở đây:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault xmlns:axis2ns1="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>axis2ns1:Server</faultcode>
<faultstring>Internal Error</faultstring>
<detail/>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Các lỗi sau đây được ghi vào giao diện điều khiển :
[10/9/12 12:21:04:177 EDT] 00000025 AxisEngine E org.apache.axis2.engine.AxisEngine receive An error was detected during JAXWS processing
org.apache.axis2.AxisFault: An error was detected during JAXWS processing
at org.apache.axis2.jaxws.server.JAXWSMessageReceiver.receive(JAXWSMessageReceiver.java:208)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:198)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
at com.ibm.ws.websvcs.transport.http.WASAxis2Servlet.doPost(WASAxis2Servlet.java:1466)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
...
Đây là đơn giản SOAPHandler
minh họa sự cố này. (Lưu ý rằng giá trị của responseXml
được hiển thị ở đây chỉ là một ví dụ. Trong thực tế SOAPHandler
của tôi, các phản hồi không được mã hóa cứng nhưng được đọc từ cơ sở dữ liệu. Tôi chỉ đang cố gắng hiển thị mã mẫu đơn giản nhất có thể.)
package simplified.demo;
import java.io.ByteArrayInputStream;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class FaultyHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!outbound) {
String responseXml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header></soapenv:Header><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>ORA-01031: insufficient privileges</faultstring><detail/></soapenv:Fault></soapenv:Body></soapenv:Envelope>";
try {
SOAPMessage newMsg = createSOAPMessage(responseXml);
context.setMessage(newMsg);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return (outbound);
}
private SOAPMessage createSOAPMessage(String responseXml) {
try {
ByteArrayInputStream in = new ByteArrayInputStream(responseXml.getBytes());
MessageFactory messageFactory = MessageFactory.newInstance();
return messageFactory.createMessage(null, in);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return true;
}
@Override
public Set<QName> getHeaders() {
return null;
}
@Override
public void close(MessageContext context) {
}
}
tôi nhận được lỗi chính xác cùng khi tôi viết mã SOAPHandler
để tạo ra một đối tượng SOAPFault
(sử dụng một SOAPFactory
) và ném nó trong một SOAPFaultException
.
Căn cứ vào dấu vết ngăn xếp, tôi đã xem mã nguồn cho JAXWSMessageReceiver
và trông giống như dưới trang bìa, Axis2 đang tìm kiếm một resultsByException, nhưng tất nhiên trong trường hợp này không có.
Có ai biết tại sao điều này đang xảy ra hoặc cách khắc phục sự cố không? Cảm ơn!
Tôi đã là 8.5.5 nhưng vẫn phải áp dụng biến chúng tôi services.unify.faults để giải quyết vấn đề –