2017-10-04 6 views
1

に次のような問題があります。私は、ファイルから作成されたバイト[]をWebサービスに渡すことはできません。クライアントコードを実行すると、サーバーログはpdfFileバイト[]のnullpointerを投げます。ここで助けてください。バイト[]を残りのWebサービスの入力として

サーバー側:

@RequestMapping(value = "/uploadForMarkPDF", method = RequestMethod.POST, consumes = { "application/octet-stream" }) 
    public ResponseEntity<byte[]> pdfMark(@RequestParam(value = "pdfFile", required = false) byte[] pdfFile) { 

     try { 

      log.info("inside pdf Mark"); 

      log.info("passed in file size:"+pdfFile.length); 
. 
. 
. 

クライアント側:

CloseableHttpClient httpclient = null; 
     byte[] data = null; 
     final String uri = "http://localhost:8080/legacyRest/uploadForMarkPDF"; 

     File pdfFile = new File("C:\\watermarktest\\form.pdf"); 

     Path fileLocation = Paths.get("C:\\watermarktest\\form.pdf"); 

     HttpPost post = new HttpPost(uri); 
     post.addHeader("Content-Type", "application/octet-stream; boundary=\"---Content Boundary\""); 
     try { 
      data = Files.readAllBytes(fileLocation); 
     } catch (IOException ex) { 

     } 

     InputStream is = new ByteArrayInputStream(data); 

     MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); 

     multipartEntityBuilder.addBinaryBody("pdfFile", data, ContentType.create("application/octet-stream"), 
       "pdfFile"); 
     multipartEntityBuilder.setBoundary("---Content Boundary"); 
     httpclient = HttpClientBuilder.create().build(); 
     HttpEntity entity = multipartEntityBuilder.build(); 
     post.setEntity(entity); 

     try { 
      HttpResponse response = httpclient.execute(post); 

      System.out.println(response); 

      HttpEntity responseEntity = response.getEntity(); 

      System.out.println(responseEntity); 

      InputStream responseStream = responseEntity.getContent(); 
+0

あなたのmultipartEntityBuilder.build()は何も構築していません。したがって、レスポンスのためにnullのrequestparam – shinjw

答えて

0

問題は、クライアント側とビルダーの誤解です。

MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); // init builder 

multipartEntityBuilder.addBinaryBody("pdfFile", data, ContentType.create("application/octet-stream"), 
      "pdfFile"); 
multipartEntityBuilder.setBoundary("---Content Boundary"); 
HttpEntity entity = multipartEntityBuilder.build(); 

この実装は、単にBuilderパターンは、フィールドを設定し、ビルダーを返す

HttpEntity entity = MultipartEntityBuilder.create().build(); 

を行うのと同じラインに沿っています。これにより、ビルダーを連鎖させることができます。ただし、ビルダーを連鎖させない場合は、作成するフィールドを保持しているため、Builderの戻りオブジェクトへの参照を保持する必要があります。

MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); 
multipartEntityBuilder = multipartEntityBuilder.setBoundary("---Content Boundary"); 

しかし、これが好ましい方法です。

HttpEntity entity = MultiPartEntityBuilder.create().set*(*).set*(*).build() 
+0

ありがとう!私はhttpclientを試した= HttpClientBuilder.create()。ビルド(); \t \t HttpEntityエンティティ= MultipartEntityBuilder.create()。setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addBinaryBody( "pdfFile"、data、ContentType.create( "アプリケーション/オクテットストリーム")、pdfFile.getName())。build() ; \t \t \t \t \t \t post.setEntity(entity); \t \t試み{ \t \t \tのHttpResponse応答= httpclient.execute(POST)。ビルダーを一緒にグループ化するが、役に立たない。それはまだ変数名pdfFileのサーバー側から値を取得できません。 –

+0

今NPEのほかに何かが投げ込まれていますか?利用可能 – shinjw

+0

残念ながら他のエラー:INFO:com.maxis.legacyRest.WatermarkService - com.maxis.legacyRest.WatermarkService.pdfMarkでPDFファイル内のマーク java.lang.NullPointerExceptionが \t(WatermarkService.java:63) \t日で。 reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)sun.reflect.NativeMethodAccessorImpl.invoke(不明なソース)sun.reflect.DelegatingMethodAccessorImpl.invokeで \t(不明なソース) –

関連する問題