gpt4 book ai didi

java - Spring Rest - 发送文件列表时出现异常

转载 作者:IT老高 更新时间:2023-10-28 13:57:55 26 4
gpt4 key购买 nike

我正在尝试使用 Spring Rest 发送文件列表,但出现此异常。

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

它适用于一个文件(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);

我尝试了以下方法,但没有成功:

  • 发送数组而不是列表
  • 将列表包装在 dto 中
  • 发送字节[] 但文件> 1.5Mb时不起作用

我一直在调试反序列化,但理解起来太痛苦了!

如果有帮助,只需一个文件,转换器'ResourceHttpMessageConverter ' 被使用。

有人有想法吗?

编辑:如果我在 map 中逐个文件添加每个文件(而不是列表),则该请求有效。

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

但我得到另一个异常(exception):org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/myApp/ws/file/save" .目标服务器上启用了基本身份验证。如果我禁用它,一切正常!这是目标服务器上的 spring-security 配置。

<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>

我在 spring 安全配置中遗漏了什么吗?

编辑2:标题中似乎没有 token “授权”,手动添加它可以解决问题

编辑 3:问题解决了!将带有 spring rest 模板的多个文件发送到启用了基本身份验证的目标服务器时,需要(重新)添加基本身份验证 token 。这里解释得很好:Basic authentication for REST API using spring restTemplate .我不知道这是否是一个错误(来自 Spring)。我这次更新前的配置(我选择了拦截器方式)是这样的:

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

我已经添加了这个:

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

类(class)是:

 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);
}

}

最佳答案

spring 安全配置文件中缺少身份验证提供程序。你可以试试这个拦截器

<authentication-manager>
<authentication-provider>
<user-service>
<user name="user" password="password" />
</user-service>
</authentication-provider>
</authentication-manager>

关于java - Spring Rest - 发送文件列表时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40806321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com