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

使用Spring Boot和Open-feign将多部分文件发送到restapi时出错

长孙昀
2023-03-14

我试图附加一个文件发送到和终结点作为MultipartFile,但我得到了这个异常:

Expected no exception to be thrown, but got 'feign.codec.EncodeException'
//...
Caused by: feign.codec.EncodeException: Could not write request: 
no suitable HttpMessageConverter found for request type [java.util.LinkedHashMap] 
and content type [multipart/form-data]

我的方法是:

//...
final User user
//...
@Override
DocumentResponse attachDocument(File file, String userId, String documentId) {

    String timestamp = String.valueOf(System.currentTimeMillis())
    String url = "${myProperties.apiUrl}/documents/attach?ts=${timestamp}"
    String digest = myJWT.sign(HttpMethod.POST, url)

    MultipartFile multiFile = new MockMultipartFile("test.xml", 
        new FileInputStream(file))

    DocumentResponse documentResponse = user.attachDocument(multiFile, 
        userId, documentId, timestamp, digest)

    return documentResponse
}

我的界面是:

@FeignClient(name = 'myUser', url = '${apiUrl}', configuration = myConfiguration)
interface User {

    //...

    @PostMapping(value = '/documents/attach', consumes = 'multipart/form-data')
    DocumentResponse attachDocument(@PathVariable('file') MultipartFile multiFile,
                                  @PathVariable('clientId') String userId,
                                  @PathVariable('documentId') String documentId,
                                  @RequestParam('ts') String timestamp,
                                  @RequestParam('digest') String digest)

}

我的配置文件是:

@Slf4j
@Configuration
class myConfiguration {

    @Bean
    Retryer feignRetryer(@Value('${feign.client.config.myUser.period}') Long period,
                     @Value('${feign.client.config.myUser.maxInterval}') Long maxInterval,
                     @Value('${feign.client.config.myUser.maxAttempts}') Integer maxAttempts) {
         return new Retryer.Default(period, maxInterval, maxAttempts)
    }

    @Bean
    ErrorDecoder errorDecoder() {
        return new ErrorDecoder() {
            @Override
            Exception decode(String methodKey, Response response) {
                if (HttpStatus.OK.value() != response.status()) {
                    FeignException ex = FeignException.errorStatus(methodKey, response)
                    if (response.status() != HttpStatus.BAD_REQUEST.value()) {
                        return new RetryableException('getting conflict and retry', new Date(System.currentTimeMillis() + TimeUnit.SECONDS
                        .toMillis(1)))
                     }
                     return new MyDocumentException()
                }
            }
        }
    }
}

此外,我还尝试将以下代码添加到myConfiguration文件:

@Bean
Encoder encoder() {
    return new FormEncoder()
}

但我还有一个例外:

Cannot cast object 'feign.form.FormEncoder@5fa78e0a' 
with class 'feign.form.FormEncoder' to class 'java.beans.Encoder'

我使用的是Spring boot'2.0.2。释放“”,方法是:

"io.github.openfeign.form:feign-form:3.4.1",
"io.github.openfeign.form:feign-form-spring:3.4.1",

我查看了这些帖子:

如何通过Spring云发送POST请求

没有为响应类型找到合适的HttpMessageConverter

无法写入请求:找不到适合请求类型和内容类型的HttpMessageConverter

将文件转换为多部分文件

有什么建议吗?

共有1个答案

林玮
2023-03-14

假装。编解码器。编码异常在编码消息时出现问题时引发。我认为@PathVariable('file')MultipartFile multiFile,可以转换为base64 sting并将其传递给REST API,或者将编码器添加到MultipartFile

 类似资料:
  • 我有两台服务器,其中服务器A向服务器B发送文件。在服务器B上,我有一个接收给定类别文件的endpoint。这是我需要将文件发送到的endpoint的签名: 现在我在用RESTTemplateExchange创建这样的请求时遇到了麻烦。在服务器A上,我试图逐个发送文件(服务器B上的endpoint需要接受多部分数组,因为它也在其他地方使用)。这就是我所尝试的: 这几乎工作,唯一的问题是,在服务器B从

  • 我希望在单个请求中同时传递json数据和多部分文件。 我已经编写了如下代码。 但是,我不能用邮递员的rest客户端完成它。 先谢谢你,

  • 问题内容: 我可以将文件作为多部分发送到servlet吗?我正在制作表单并将其作为多部分提交,但是以某种方式我没有收到成功上传它的回复。我不希望刷新页面,因此它必须由ajax进行。 问题答案: 只有使用XHR API(以前称为“ XHR2”或“ XHR Level 2”的一部分,当前称为“ XHR高级功能”)才有可能。 有了这个HTML, 您可以按以下方式上传: XHR将注意适当的头和请求主体编码

  • 我试图使用Feign.HeaderMap注释在rest请求中传递HTTP头的映射,但它们出现在主体中。

  • 我正在尝试同时向rest api发送一些文件。试图实现这个答案 我在目录下有10个文件。 当我执行此操作时,第一个文件被发送的次数与我在方法。 如果我分配5个线程,第一个文件(每次执行时不同)会被发送5次,而其余的文件只发送一次!对于10个线程,它被发送10次! 为什么只有一个文件被多次发送,而其他文件却没有?我在代码中做错了什么? 编辑:我将文件发送到的api在上使用。这是文件的处理方式。 论资

  • 我试图创建一个页面,用户可以张贴图像及其细节。现在,当我测试来自postman的spring boot服务时,我能够成功地在服务中获取文件。当我试图从angular5中做同样的事情时,多部分文件在服务中没有被识别,并且总是得到空数组。 我的角服务代码如下 } 我已经尝试添加标头,如multipart/form-data,并将其设置为un定义。无论哪种方式,我都收到了错误。在发布到这里之前,我已经广