2016-12-23 15 views
9

Tôi có trường hợp tôi muốn tải lên tệp văn bản từ máy khách .Net tới Java REST API ở định dạng InputStream. Khi tôi nhấn REST Java từ Postman với File trong Form-Data Body, tệp đang nhận được trong dịch vụ Java REST hoàn toàn ổn. Khi tôi cố gắng là điều tương tự từ. Net Client, tôi đã nhận được một số ngoại lệ như dưới đây.Tải lên tệp văn bản từ ứng dụng khách http .Net tới Java REST API ở định dạng InputStream

Net HTTP mã khách hàng của tôi là như dưới đây,

var client = new HttpClient(); 
client.BaseAddress = new Uri("http://localhost:8082/processes/view/createDocumentfromFile/851"); 
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
client.DefaultRequestHeaders.Add("procId", "100"); 
client.DefaultRequestHeaders.Add("DocName", "ProphetWorkflow"); 
var content = new MultipartFormDataContent(); 
content.Add(new ByteArrayContent(File.ReadAllBytes(@"C:\Users\charan.ghate\Desktop\Calculation.txt"))); 
HttpResponseMessage messge = client.PostAsync(client.BaseAddress, content).Result; 
if (messge.IsSuccessStatusCode) 
{ 
    string result = messge.Content.ReadAsStringAsync().Result; 
    lblResponse.Text = result; 
} 

My Java REST của Mã dịch vụ là như dưới đây,

@POST 
@Path("/createDocumentfromFile/{procId}") 
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN }) 
@Produces({ MediaType.APPLICATION_JSON }) 
public Response createDocumentfromFile(@PathParam("procId") Long piOID, @HeaderParam("DocName") String modulename, 
     @Context HttpServletRequest request, @Context HttpServletResponse response, 
     @FormDataParam("file") InputStream uploadedInputStream) { 
// 
//Operation on the input stream 
// 
} 

Khi tôi nhấn một API REST, tôi đã nhận được ngoại lệ tại cả hai bên trong. Net cũng như Trong Java, được nêu chi tiết bên dưới

.Net Thông báo lỗi:

StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: 
{ 
    Connection: close 
    Date: Fri, 23 Dec 2016 15:08:03 GMT 
    Server: Apache-Coyote/1. 

Java ngoại lệ:

Dec 23, 2016 8:38:03 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [cxf-jaxrs-servlet] in context with path [/ipp-portal] threw exception [Servlet execution threw an exception] with root cause 
java.lang.NoSuchMethodError: javax.ws.rs.ClientErrorException.validate(Ljavax/ws/rs/core/Response;Ljavax/ws/rs/core/Response$Status$Family;)Ljavax/ws/rs/core/Response; 
    at javax.ws.rs.ClientErrorException.<init>(ClientErrorException.java:88) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:503) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:198) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:90) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239) 
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248) 
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222) 
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153) 
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.eclipse.stardust.ui.web.html5.EnhancedJarResourceFilter.doFilter(EnhancedJarResourceFilter.java:140) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at com.icesoft.faces.webapp.http.servlet.TouchSessionFilter.doFilter(TouchSessionFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Ông có thể gợi ý cho tôi cách tốt nhất để chuyển một tập tin từ Net Client để Java REST của dịch vụ.

Trả lời

2

Ngoại lệ

java.lang.NoSuchMethodError: javax.ws.rs.ClientErrorException.validate(Ljavax/ws/rs/core/Response;Ljavax/ws/rs/core/Response$Status$Family;)Ljavax/ws/rs/core/Response;

có nghĩa là nó sẽ cố gắng để có được một phương pháp trong thời gian chạy kiểu Response validate(final Response response, Response.Status.Family expectedStatusFamily) từ lớp ClientErrorException rằng nó không thể tìm thấy.

Điều này thường xảy ra khi bạn xây dựng ứng dụng của mình bằng một phiên bản thư viện và bạn chạy nó với một phiên bản khác không tương thích.

Biết rằng phương pháp này đã được thêm từ JAX-RS 2.0, tôi tin rằng bạn đã biên dịch mã của mình bằng JAX-RS 2.0 hoặc cao hơn và bạn có phiên bản 1.x trong đường dẫn lớp được sử dụng thay cho Thời gian chạy. Kiểm tra đường dẫn lớp được sử dụng tại Thời gian chạy và đảm bảo rằng bạn chỉ có cùng một phiên bản của JAX-RS mà bạn đã sử dụng tại thời gian biên dịch.

1

Điều có thể xảy ra là máy chủ không thích yêu cầu, chuẩn bị gửi lỗi và không thành công do thư viện không khớp (như được chỉ định bởi Nicolas Filotto). Đây là lý do tại sao bạn nhìn thấy lỗi HTTP 500 chung thay vì một số (nhiều thông tin) 4XX.

Resolve phiên bản thư viện không phù hợp có lẽ là một ý tưởng tốt, ngay cả khi nó hoạt động khi yêu cầu phù hợp với những gì các máy chủ mong muốn (như cho thấy với Postman)

Nhìn vào chữ ký của cả hai bên, đây là những gì tôi có thể nghĩ về:

  • thêm MediaType.MULTIPART_FORM_DATA_TYPE vào loại nội dung được tiêu thụ.

  • xóa client.DefaultRequestHeaders.Add("procId", "100");, vì procId được mong đợi trên đường dẫn chứ không phải trong tiêu đề.

  • thêm file như tên gọi của ByteArrayContent:

    content.Add(new ByteArrayContent(File.ReadAllBytes(@"C:\Users\charan.ghate\Desktop\Calculation.txt")), "file"); 
    

Ngoài ra bạn có thể thử để vô hiệu hóa Expect: 100-continue tiêu đề được sử dụng bởi mặc định bằng .NET HttpClient, một số máy chủ không xử lý nó.

client.DefaultRequestHeaders.ExpectContinue = false; 
Các vấn đề liên quan