2016-12-23 17 views
9

.Net httpクライアントからJava REST APIにInputStream形式のテキストファイルをアップロードする場合があります。 Form-Data BodyのFileでPostmanからJava RESTを起動すると、ファイルはJava RESTサービスで完全に正常に受信されています。試してみると、.Net Clientと同じことですが、私は以下のようないくつかの例外があります。.Net httpクライアントからJava REST APIにInputStream形式でアップロードする

マイネットHTTPクライアントコードが

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; 
} 

私のJavaのRESTサービスコードは、以下の通りである私は、REST APIを打つとき

@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 
// 
} 

は、私が例外を取得している、以下の通りであります

:両方.NETでだけでなく、Javaでは側は、

ネットエラーメッセージの下に詳細

Java例外:

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) 

あなたは私のJavaのRESTサービスに.NETクライアントからファイルを転送するための最良の方法を提案してくださいでした。

答えて

2

例外

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;

は、それが見つけることができないクラスClientErrorExceptionからタイプResponse validate(final Response response, Response.Status.Family expectedStatusFamily)の実行時にメソッドを取得しようとしていることを意味します。

これは一般に、あるバージョンのライブラリでアプリケーションをビルドし、互換性のない別のバージョンに対して実行すると発生します。この方法は、JAX-RS 2.0以降に追加されたことを知って

は、私はあなたがJAX-RS 2.0以上を使用してコードをコンパイルすることを信じて、実行時に代わりに使用され、あなたのクラスパスにバージョン1.xを持っています。実行時に使用されているクラスパスを確認し、コンパイル時に使用したのと同じバージョンのJAX-RSがあることを確認してください。

1

おそらく、サーバがリクエストを好きではなく、エラーを送信する準備をしていて、ライブラリの不一致(Nicolas Filottoが指摘している)のために失敗している可能性があります。このため、いくつかの(より有益な)4XXではなく、一般的なHTTP 500エラーが表示されます。

ライブラリのバージョンの不一致が要求は、サーバーが(ポストマンで示したように)期待するものと一致したときにそれが動作しても、おそらく良いアイデアです解決

両側の署名を見てみると、これは私ができるものです考える:

  • 消費コンテンツタイプにMediaType.MULTIPART_FORM_DATA_TYPEを追加します。

  • procIdがヘッダーではなくパス上にあると予想されます。

  • ByteArrayContentの名前としてfileを追加します。

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

をさらにあなたには、いくつかのサーバがそれを処理しない、.NET HttpClientでデフォルトで使用Expect: 100-continueヘッダーを無効にしてみてください。

client.DefaultRequestHeaders.ExpectContinue = false; 
関連する問題