2016-12-15 17 views
5

Ai đó có thể giúp tôi với sự cố lạ?Dịch vụ xà phòng hoạt động cục bộ nhưng trên một máy chủ khác đang nâng cao ngoại lệ ClassCast

Tôi có một dịch vụ:

@WebMethod 
@WebResult(name = "sendCustomerCommunicationResponse", targetNamespace = "......something/Underwriting/Correspondance/V1", partName = "Body") 
public SendCustomerCommunicationResponse sendCustomerCommunication(
    @WebParam(name = "sendCustomerCommunicationRequest", targetNamespace = "........something/Underwriting/Correspondance/V1", partName = "Body") 
    SendCustomerCommunicationRequest body) 
    throws ServiceException_Exception, SystemException_Exception 
; 

Và tại địa phương tôi gọi nó với:

SendCustomerCommunicationResponse response = correspondanceServicePort.sendCustomerCommunication(sendCustomerCommunicationRequest); 

Và điều này làm việc tốt. Nhưng khi tôi triển khai ứng dụng trên một máy chủ khác, tôi nhận được:

"java.lang.ClassCastException: 
    it.usi.xframe.ub1.batch.services.esb.SendCustomerCommunicationRequest incompatible with 
    it.usi.xframe.ub1.batch.services.esb.SendCustomerCommunicationResponse" 

P.S. Các ứng dụng đang chạy trên máy chủ WebSphere

Yêu cầu là:

<soapenv:Envelope ...someSchema...> 
    <soapenv:Header> 
     <v1:TechnicalHeader> 
     <v1:correlationId>12742</v1:correlationId> 
     <v1:sender>userName</v1:sender> 
     <v1:countryCode/> 
     <v1:channelId/> 
     <v1:userID>userName</v1:userID> 
     <v1:operationId>CHANGE_STATUS</v1:operationId> 
     </v1:TechnicalHeader> 
     <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
            <wsse:UsernameToken> 
               <wsse:Username>someUser</wsse:Username> 
               <wsse:Password>somePassoword</wsse:Password> 
            </wsse:UsernameToken> 
         </wsse:Security> 
    </soapenv:Header> 
    <soapenv:Body> 
     <v11:sendCustomerCommunicationRequest> 
     <v11:eventCode>{"header":{"publishingDate":1474016634749,"eventId":"DEL-NEG","applicationCode":"UB3","correlationId":"9999","language":"IT","channelId":"MOB"},"body":{"ndg":"5106215","additionalInfo":{}}}</v11:eventCode> 
     </v11:sendCustomerCommunicationRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 
+0

Không ai? Không có gì? :( – Aditzu

+0

Có gì đó đang cố gắng gán một đối tượng yêu cầu cho biến trả lời hoặc ngược lại. Ngăn xếp cuộc gọi ngoại lệ sẽ hiển thị vị trí cần xem –

+0

EXECUTE ERROR java.lang.ClassCastException: it.usi.xframe.ub1. batch.services.esb.customerCommunication2.SendCustomerC ommunicationRequest không tương thích với nó.usi.xframe.ub1.batch.services.esb.customerCommunication2.SendCustomerCommunicationResponseQ ZQat com.sun.proxy. $ Proxy84.sendCustomerCommunication (Unknown Source) QZQat it.usi .xframe.ub1.batch.steps.close.ST002CLO.callEsbForPo các phiên bản (ST002CLO.java:241) QZQat it.usi.xframe.ub1.batch.steps.close.ST002CLO.managePositionList (ST002CLO.java:367) QZQat it .usi.xfram e.ub1.batch.steps.close.ST002CLO.run (ST002CLO.java:1 – Aditzu

Trả lời

1

Có lẽ nó có thể là một vấn đề WebSphere JAXB, liên quan đến phiên bản bạn đang sử dụng hoặc máy chủ của bạn có thể bỏ lỡ một số vửng. Hãy xem what the docs say:

JAXB Unmarshaller tạo các lớp sơ khai trong thời gian chạy để hỗ trợ trong unmarshalling tài liệu. Các lớp được tạo này được lưu trong bộ nhớ cache và có thể sử dụng lại các JAXBContexts khác trong ứng dụng sau khi sử dụng lại .

Khi một JAXBContext chứa một lớp học trong đó có một yếu tố wildcard (ví dụ: @XmlAnyElement) nó đã có thể rằng Unmarshaller sẽ sử dụng lớp còn sơ khai tạo ra không tương thích từ JAXBContext khác mà có thể dẫn đến một ClassCastException bị ném trong unmarshalling. Vấn đề đã được giải quyết bằng cách cải thiện va chạm kiểm tra được thực hiện trên các lớp sơ khai đã tạo trước đó để một lớp học mới được tạo từ JAXBContext hiện tại nếu trước đó lớp sơ khai được tạo trong bộ đệm không tương thích.

Thật khó đoán vì bản chất của IBM bất kể phiên bản bạn đang sử dụng. Ngoài ra, tham khảo một số vửng khác:

+0

Cảm ơn bạn đã trả lời? Bạn có thể vui lòng cho tôi biết làm cách nào để tôi tạo séc để tạo sơ khai mới thay vì sử dụng các sơ đồ được lưu trong bộ nhớ cache? – Aditzu

1

Nó có vẻ như vấn đề là trên máy chủ (hoặc với yêu cầu).

Khi máy chủ xử lý yêu cầu, nó chỉ tạo ra tiếng vọng của nó. Tải trọng thư không bị thay đổi (vì bất kỳ lý do nào) và không có ngoại lệ nào bị ném.

Vì vậy, khi nó quay trở lại và unmarshalled nó không phải là thể hiện của SendCustomerCommunicationResponse, nhưng SendCustomerCommunicationRequest

Tôi có thể đề nghị đầu tiên sử dụng soapUI (với mẫu theo yêu cầu) hoặc tcpMon giữa client và server để xem yêu cầu chính xác là những gì và phản hồi từ máy chủ.

1

Q:

  • như thế nào SendCustomerCommunicationResponse được xác định? nó có bao gồm chú thích @Xml.. không? (Ví dụ @XmlRoot ..
  • chỉ để thử nghiệm, có thể giúp bạn đặt tên cho biến @WebResult trở về một cái gì đó khác với tên của lớp trở lại (SendCustomerCommunicationResponse)
  • gì là ServiceException_ExceptionSystemException_Exception? Trường hợp ngoại lệ của riêng bạn? Có vẻ như đó là những JAX-RS/JAXB tạo ra ngoại lệ ..
1

Nó trông giống như một vấn đề cấp phiên bản không phù hợp.

một trong những kịch bản mà các nhà phát triển tạo ra cuống Web-Dịch vụ và xây dựng chúng trong dự án của họ sử dụng một phiên bản mới hơn trong khi đó rver classpath có một phiên bản cũ hơn của một số tệp jar phụ thuộc. Tôi sẽ giới thiệu các bước sau để loại trừ tùy chọn này của các phiên bản phụ thuộc không khớp.

  1. Lấy cây phụ thuộc và cho các tệp không thành công. Bạn sẽ nhận được một danh sách các tệp jar phụ thuộc. (Kiểm tra cụ thể tệp jar chịu trách nhiệm tạo đối tượng Yêu cầu và Trả lời trong máy cục bộ của bạn)
  2. So sánh đường dẫn lớp của máy chủ WebSphere và thêm bất kỳ lọ nào bị thiếu.
  3. thay thế bất kỳ tệp jar phụ thuộc nào trong đường dẫn lớp WebSphere nếu chúng thuộc về một phiên bản cũ hơn.

Cách tiếp cận thứ hai có thể là thực hiện gỡ lỗi từ xa, nếu có thể, sau khi bật trình biên dịch de trong IDE của bạn. Kiểm tra các tệp lớp nơi ngoại lệ xảy ra và đảm bảo rằng trình chỉnh sửa được liên kết với giao diện điều hướng, để đảm bảo rằng trình điều hướng của bạn hiển thị tệp trong bình đang được gỡ lỗi. Bạn sẽ có thể tìm thấy tệp jar chính xác được gọi tại thời điểm ngoại lệ.

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