2012-10-09 40 views
15

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!

Trả lời

3

Vấn đề thực tế không phải là mất tích do ngoại lệ, đó là thay vì một xử lý trong WebSphere lỗi thống nhất:

http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524

Hoặc sử dụng workaround được mô tả hoặc cài đặt ít nhất 8.0.0.4

+0

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 đề –

1

WebSphere bắt đầu bằng phiên bản 8 có tính năng bảo mật được bật mặc định, chỉ trả lại thông báo "Lỗi nội bộ". Điều này được thực hiện cho "preventing detailed information regarding why inbound message processing failed from being returned to message senders". Tìm kiếm "webservices.unify.faults"

Để tắt tính năng này, hãy thêm một -Dwebservices.unify.faults = false vào thuộc tính tùy chỉnh JVM của bạn.

3

Tôi gặp sự cố tương tự và có thể giải quyết vấn đề bằng cách tắt xử lý lỗi thống nhất (không phải lỗi, đó là tính năng!).

Trên WS Developer console

https://<yourhost>/<yourport>/ibm/console/login.do 

làm như mô tả here (ví WAS8):

Bấm Servers> Các loại Server. và cả máy chủ ứng dụng WebSphere> server_name hoặc máy chủ proxy WebSphere> server_name. Tiếp theo, trong phần Cơ sở hạ tầng máy chủ, nhấp vào Java và quản lý quy trình> Định nghĩa quy trình và chọn Kiểm soát, Servant hoặc Adjunct. Sau đó nhấp vào Máy ảo Java> Thuộc tính tùy chỉnh.

Có, thêm thuộc tính mới webservices.unify.faults và đặt giá trị thành false.

enter image description here

0

Lỗi này có thể được giải quyết bằng cách tắt tính năng xử lý trên IBM Websphere Application Servers lỗi chung chung.

Để tắt thuộc tính này, hãy điều hướng đến Bảng điều khiển dành cho quản trị viên> Máy chủ> Máy chủ ứng dụng>> Định nghĩa quy trình> Máy ảo Java> Thuộc tính tùy chỉnh.

Nhập Khóa dưới dạng 'webservice.unify.faults' và giá trị là 'false'.

Sau khi cập nhật, khởi động lại máy chủ của bạn và cài đặt các EAR để nhận các lỗi WSDL tùy chỉnh cho các giao dịch SOAP của bạn.

0

tôi đã cùng một vấn đề sau khi nâng cấp WS FP 8.5.5.10 để 8.5.5.12. Chúng tôi đã có hai dịch vụ với tên phương pháp chính xác tương tự nhưng khác nhau targetNameSpace, như DomainService1 có 'get' phương pháp và DomainService2 cũng có 'get' phương pháp, nhưng WS 8.5.5.12 ném ngoại lệ này và không cho bất kỳ đầu mối nào để tìm nguyên nhân gốc rễ. Rõ ràng WS là nghiêm ngặt hơn trong phiên bản gần đây với việc đặt tên của các phương pháp.

Đây là ngoại lệ: org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: Có lỗi xảy ra khẳng định nội bộ. Các đối tượng com.xxx.web.myapp.services.jaxws.GetResponse JAXB không có một xml xxxxxStatus

Sau khi thay đổi tên của phương pháp cụ thể cho từng dịch vụ 'getABC' và 'getPQR' nó làm việc !!!

hy vọng công trình này hoạt động!

Các vấn đề liên quan