2017-08-02 32 views
1

タイトルはよく見えるかもしれませんが、それらのどれもが私の問題に適合しません。Resttemplate経由でスプリングレストサービス経由でファイルを送信

私は通常のパラメータとマルチパートの形式でファイルを受け入れる休憩サービスを持っています。

reststemplateを使用して、上記の休憩サービスにデータとファイルを送信します。

通常の文字列データを送信するまでは何の問題もありませんでした。一度私はバイトを送信するコードを追加します。400 Bad request error。

ByteArrayResourceを送信するコメントコードがあれば、通常のパラメータで動作します。以下

サンプルコード

レストサービスコントローラ

@RestController 
@RequestMapping(value="/ticket") 
public class UserTicketController { 

@RequestMapping(value="/createTicket.do",method={RequestMethod.POST}, 
     consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},headers={"content-type="+MediaType.MULTIPART_FORM_DATA_VALUE}) 
public void createTicket(@ModelAttribute ServiceDeskRequest serviceDeskRequest, HttpServletRequest request,HttpServletResponse response) throws Exception{ 

} 

} 

がServicedeskrequestモデル属性が

public class ServiceDeskRequest implements Serializable{ 


private String jsonData; 
private MultipartFile attachment; 
} 

アプリケーションのcontext.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
</bean> 

クライアントSでありますイドコード

RestTemplate restTemplate = new RestTemplate(); 
     MultiValueMap<String, Object> requestParamerterMap = new LinkedMultiValueMap<String, Object>(); 

     requestParamerterMap.add("jsonData", jsonData); 
     MultipartFile attachment = userRequest.getAttachment(); 

     if(attachment!=null && attachment.getOriginalFilename()!=null) { 
      ByteArrayResource byteArrayResource = new ByteArrayResource(attachment.getBytes(), attachment.getOriginalFilename()); 
      requestParamerterMap.add("attachment", byteArrayResource); 
     } 

     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.MULTIPART_FORM_DATA); 

     HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(requestParamerterMap, headers); 


     String response = restTemplate.postForObject(targetUrl, requestEntity, String.class); 

答えて

0

最初に、value="/createTicket.do"はREST規則から離れています。 /ticketも同じです。 チケットの作成は、POSTによってURLに行われます。.../tickets/

1

私はそれを理解しました。このパズルには2つの部分があります。サービスコードに変更はありません。

  1. restatemplateに右のコンバータを提供します。デフォルトのコンバーターのリストでは、SpringはFormHttpMessageConverterを追加しません。

    FormHttpMessageConverter converter = new FormHttpMessageConverter(); 
    
        RestTemplate restTemplate = new RestTemplate(); 
        restTemplate.getMessageConverters().add(converter); 
    
  2. bytearrayresourceクラスをオーバーライドします。 plzはgetFilenameメソッドをオーバーライドする必要がありますので、サービス側でドキュメント名を受け取れるようにしてください。上記の後

     public class MultipartByteArrayResource extends ByteArrayResource{ 
    
        private String fileName; 
    
         public MultipartByteArrayResource(byte[] byteArray) { 
          super(byteArray); 
         } 
    
         public String getFilename() { 
          return fileName; 
         } 
    
         public void setFilename(String fileName) { 
          this.fileName= fileName; 
         } 
    
        } 
    

クライアントコードは

 FormHttpMessageConverter converter = new FormHttpMessageConverter(); 

     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.getMessageConverters().add(converter); 

     MultiValueMap<String, Object> requestParamerterMap = new LinkedMultiValueMap<String, Object>(); 

     requestParamerterMap.add("jsonData", jsonData); 

     MultipartFile attachment = userRequest.getAttachment(); 

     if(attachment!=null && attachment.getOriginalFilename()!=null) { 
      //ByteArrayResource byteArrayResource = new ByteArrayResource(attachment.getBytes(), attachment.getOriginalFilename()); 

      MultipartByteArrayResource resource = new MultipartByteArrayResource(attachment.getBytes()); 

      //pass file name sepratly 
      resource.setFilename(attachment.getOriginalFilename()); 

      requestParamerterMap.add("attachment", resource); 
     } 

     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.MULTIPART_FORM_DATA); 

     HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(requestParamerterMap, headers); 

     String response = restTemplate.postForObject(targetUrls.get("sdCreateTicketsUrl"), requestEntity, String.class); 
される変更
関連する問題