2016-11-25 7 views
11

Spring Restでファイルのリストを送信しようとしていますが、この例外が発生します。Spring Rest - ファイルのリストを送信する際の例外

Could not write content: No serializer found for class java.io.ByteArrayInputStream

これは、1つのファイル(ByteArrayResource)で動作します。

ファイルリスト(List<ByteArrayResource>)では機能しません。

  • リスト
  • リストをラップするのではなく、配列を送信:私は動作しませんでした次のことを試してみた

    List<ByteArrayResource> contentsAsResource = new ArrayList<ByteArrayResource>(); 
    for(MultipartFile fichier : fichiers) { 
        contentsAsResource.add(new ByteArrayResource(fichier.getBytes()) { 
         @Override 
         public String getFilename() 
         { 
          return fichier.getOriginalFilename(); 
         } 
        }); 
    }; 
    map.add("files", contentsAsResource); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.MULTIPART_FORM_DATA); 
    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<LinkedMultiValueMap<String, Object>>(map, headers); 
    
    FormHttpMessageConverter formConverter = new FormHttpMessageConverter(); 
    formConverter.setMultipartCharset(Charset.forName("UTF8")); 
    formConverter.addPartConverter(new MappingJackson2HttpMessageConverter()); 
    
    this.restClientHelper.getRestTemplate().getMessageConverters().add(formConverter); 
    this.restClientHelper.getRestTemplate().postForObject("file/save", requestEntity, Object.class); 
    

    :ここ

    は、私のコードの重要な部分であります
  • バイトを送信しますが、ファイルが1.5Mbを超えると機能しません>

私はデシリアライゼーションをデバッグしてきましたが、理解するのはとても苦痛です!

1つのファイルでは、コンバータ 'ResourceHttpMessageConverter'が使用されます。

誰でも知っていますか?

EDIT:各ファイルを(リストではなく)マップでファイルに追加すると、リクエストが機能します。

for (MultipartFile fichier : fichiers) { 
    map.add("files", new ByteArrayResource(fichier.getBytes()) { 
    @Override 
    public String getFilename() 
    { 
     return fichier.getOriginalFilename(); 
    } 
    }); 
}; 

しかし、別の例外があります:org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/myApp/ws/file/save"です。送信先サーバーには基本認証が有効になっています。私がそれを無効にした場合、すべてが機能しています!ここでは、宛先サーバー上の春のセキュリティ構成です。

<http pattern="/ws/file/**" authentication-manager-ref="basicAuthenticationManager" create-session="stateless"> 
     <intercept-url pattern="/**" access="isAuthenticated()"/> 
     <http-basic /> 

     <csrf disabled="true" /> 
     <headers disabled="true" /> 
</http> 

春のセキュリティ設定で何か不足していますか?

EDIT 2:問題解決:手動で問題

EDIT 3を固定する追加、ヘッダ内のトークン「認可」は存在しないようです!基本認証を有効にしてバースレストテンプレートを含む複数のファイルを送信先サーバーに送信する場合は、基本認証トークンを(再)追加する必要があります。ここでよく説明されています:Basic authentication for REST API using spring restTemplate。私はそれがバグかどうかわからない(春から)。このアップデートの前に私の設定は(私はインターセプタの道を選択しました)このでした:

this.restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(username, password)); 

クラスは次のとおりです:春のセキュリティ設定で

private static class BasicAuthorizationInterceptor implements ClientHttpRequestInterceptor 
{ 

    private final String username; 

    private final String password; 

    public BasicAuthorizationInterceptor(String username, String password) 
    { 
    this.username = username; 
    this.password = (password == null ? "" : password); 
    } 

    @Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException 
    { 
    byte[] token = Base64.getEncoder().encode((this.username + ":" + this.password).getBytes()); 
    request.getHeaders().add("Authorization", "Basic " + new String(token)); 
    return execution.execute(request, body); 
    } 

    } 
+0

をインターセプタの代わりにこれを試すことができます。com/questions/25103070/resttemplate-httpmessagenotwritableexception-no-serializer-found-for-class-ja) – Onkar

+0

ありがとうございました。私はこのポストを見た。私のコードは全く同じです。 – Clemzd

+0

あなたの質問はもはや春休みテンプレートではなく、春のセキュリティについてですか?宛先サーバでセキュリティをサポートしたい場合は、リクエストを認証する必要があります(ヘッダーを設定する:Authorization:Basic QWxhZGRpbjpPcGVuU2VzYW1l' –

答えて

0

final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(login, motDePasse)); 
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); 
... 
final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); 
requestFactory.setHttpClient(httpClientBuilder.build()); 
this.restTemplate = new RestTemplate(requestFactory); 

私はこれを追加しましたファイルに認証プロバイダがありません。 // stackoverflowの: あなたは、http([これを参照してください]

<authentication-manager> 
    <authentication-provider> 
     <user-service> 
     <user name="user" password="password" /> 
     </user-service> 
    </authentication-provider> 
</authentication-manager> 
関連する問題