2017-10-04 3 views
1

다음과 같은 문제점이 있습니다. 파일에서 웹 서비스로 만든 byte []를 전달할 수 없습니다. 내 클라이언트 코드를 실행할 때 서버 로그는 pdfFile 바이트 []에 대해 nullpointer를 던집니다. 여기서 도와주세요.바이트 []를 나머지 웹 서비스의 입력으로

서버 측 :

@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(); 

이 구현은 빌더 패턴은 필드를 설정하고 빌더를 반환

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

을하고 같은 라인을 따라합니다. 그러면 빌더를 함께 연결할 수 있습니다. 그러나 빌더를 체인 연결하지 않은 경우, 빌더의 리턴 오브젝트에 대한 참조를 유지해야합니다.이 필드는 사용자가 채우기를 원하는 필드를 보유하고 있기 때문에 작성자의 리턴 오브젝트에 대한 참조를 유지해야합니다.

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

그러나 이것은 바람직한 접근 방법입니다.

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

답장을 보내 주셔서 감사합니다! 나는 httpclient = HttpClientBuilder.create()를 시도했다. build(); \t \t HttpEntity 엔티티 MultipartEntityBuilder.create =(). setMode (HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody ("pdfFile"데이터 ContentType.create (는 "application/octet-stream") pdfFile.getName는()). (구축) ; \t \t \t \t \t \t post.setEntity (엔티티); \t \t 시도 { \t \t \t HttpResponse에 응답 = httpclient.execute (POST); 즉 빌더를 그룹화하지만 아무 소용이 없습니다. 여전히 변수 이름 pdfFile의 서버 측에서 값을 가져올 수 없습니다. –

+0

NPE가 던져 진 물건이 있습니까? – shinjw

+0

불행하게도 다른 오류 사용할 수 : INFO : com.maxis.legacyRest.WatermarkService - PDF 마크 내부 java.lang.NullPointerException이 일에 \t com.maxis.legacyRest.WatermarkService.pdfMark (WatermarkService.java:63)에서 \t. reflect.NativeMethodAccessorImpl.invoke0 (원시 메소드) sun.reflect.NativeMethodAccessorImpl.invoke (알 소스)에 sun.reflect.DelegatingMethodAccessorImpl.invoke \t (알 소스)에 –