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);
}
}
をインターセプタの代わりにこれを試すことができます。com/questions/25103070/resttemplate-httpmessagenotwritableexception-no-serializer-found-for-class-ja) – Onkar
ありがとうございました。私はこのポストを見た。私のコードは全く同じです。 – Clemzd
あなたの質問はもはや春休みテンプレートではなく、春のセキュリティについてですか?宛先サーバでセキュリティをサポートしたい場合は、リクエストを認証する必要があります(ヘッダーを設定する:Authorization:Basic QWxhZGRpbjpPcGVuU2VzYW1l' –