当前位置: 首页 > 知识库问答 >
问题:

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

沈骞仕
2023-03-14

我试图用Spring Rest发送一个文件列表,但我遇到了这个例外。

无法写入内容:找不到java.io.ByteArrayInputStream类的序列化程序

以下是我的代码的重要部分:

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时不起作用
for (MultipartFile fichier : fichiers) {
  map.add("files", new ByteArrayResource(fichier.getBytes()) {
    @Override
    public String getFilename()
    {
      return fichier.getOriginalFilename();
    }
  });
};

但我得到另一个异常:org.springframework.web.client.ResourceAccessException:“http://localhost:8080/myapp/ws/file/save”的POST请求时出现I/O错误。目标服务器上启用了基本身份验证。如果我禁用了它,一切都正常了!下面是目标服务器上的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 Security配置中遗漏了什么?

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

编辑三:问题解决!当将带有spring rest模板的multiples文件发送到启用基本身份验证的目标服务器时,需要(重新)添加基本身份令牌。这里有很好的解释:使用spring RestTemplate对REST API进行基本身份验证。我不知道是不是(Spring来的)bug。我在这次更新之前的配置(我选择了拦截器方式)是这样的:

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

类是:

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

  }

共有1个答案

缪阎宝
2023-03-14

Spring Security配置文件中缺少身份验证提供程序。你可以试试这个代替拦截器

<authentication-manager>
   <authentication-provider>
       <user-service>
       <user name="user" password="password"  />
       </user-service>
   </authentication-provider>
</authentication-manager>
 类似资料:
  • 第一次使用java邮件。我正在遵循本教程,但我已经无法发送基本消息,并且我收到了一个非常奇怪的错误: 奇怪的是,我的代码中没有使用IMAP: 错误发生在最后一行(发送)。我知道smtp服务器正常工作。 有什么建议吗?为什么会发生这种情况?我该如何解决? 编辑:显然,地址/主机在这里发生了更改,我使用的是在实际代码中工作的真实地址/主机。

  • 摘自:https://docs.microsoft.com/en-us/azure/cosmos-db/create-graph-dotnet 我在 .wait() 部分遇到异常: 代码:

  • 我有这个jsp代码。 UserList由数据类型为“Car”的名为“car”的属性组成 用户的Pojo类: 我使用的是Spring MVC框架。在页面加载时,我的应用程序应该显示一个包含用户列表的表格。在controller中,我查询用户列表,并将其添加到ModelAndView对象中 控制器代码: 当我尝试不使用car(tabledata标记)时,JSP正在毫无例外地运行,并在表中显示用户列表。

  • 我正试图在詹金斯设置电子邮件通知 但当我点击测试配置时,我得到了下面的错误 请参考附件截图以及下面的错误 请帮帮我,我被困在这里了。 太阳安全供应商。certpath。SunCertPathBuilderException:找不到请求目标的有效证书路径 原因:sun.security.validator.验证器异常:PKIX路径构建失败 原因:javax。网ssl。SSLHandshakeExce

  • 我下载了以下链接: http://www.java2s.com/Code/JarDownload/java/java-json.jar.zip 然后,我将jar添加到构建路径:右键单击项目 我能够使用java-json库而不会出现任何错误。然而,当我将项目导出到一个jar时,没有选项将java-json引用库作为jar的一部分。所以我假设通过将库添加到构建路径,我不必导出外部罐(无论如何也没有选项

  • 我想创建. zip文件,其中包含我从后端收到的压缩文件,然后将此文件发送给用户。两天来,我一直在寻找答案,但找不到合适的解决方案,也许你可以帮我:) 目前,代码是这样的:(我知道我不应该在spring控制器中完成所有工作,但不关心这一点,它只是为了测试目的,以找到使其工作的方法) 但问题是,使用的代码,当我输入URL:localhost:8080/zip我得到文件:test.zip.html而不是