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

Spring集成-无法使用Http入站网关处理多部分/表单数据

穆飞龙
2023-03-14

这是一个Spring集成(基于Spring Boot)项目,我已经配置了Spring集成应用程序,如下所示,

配置xml:


<int:channel id="httpChannel"/>

 <int-http:inbound-gateway  supported-methods="GET,POST" request-channel="httpChannel" reply-channel="outputChannel" path="/"
  message-converters="converter" 
 /> 
 <bean id="converter" class="in.tc.springintegrationdemo.CustomConverter" />
    
    
  <int:transformer ref="customTransformer" input-channel="httpChannel" output-channel="outputChannel" />  

  <bean id="customTransformer" class="in.tc.springintegrationdemo.MultipartTransformer" />  
  
   <bean class="in.tc.springintegrationdemo.MessageUpdateBean" id="printMessage"/> 
<int:service-activator ref="printMessage" method="print"  input-channel="outputChannel">
</int:service-activator>

CustomConverter定义如下


public class CustomConverter implements HttpMessageConverter<MultiValueMap<String,?>> {

    @Override
    public boolean canRead(Class<?> clazz, MediaType mediaType) {
      ...
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        return false;
    }

    @Override
    public List<MediaType> getSupportedMediaTypes() {
        return Collections.singletonList(MediaType.MULTIPART_FORM_DATA);
    }

    @Override
    public MultiValueMap<String,?> read(Class<? extends MultiValueMap<String,?>> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {
         MultiValueMap<String, ?> result = new LinkedMultiValueMap<>();
         String str = "";
        MediaType contentType = inputMessage.getHeaders().getContentType();
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(inputMessage.getBody(), contentType.getCharset()));
                while((str=bufferedReader.readLine())!=null) {
                
                    //code to retrieve multipart data
                }
        return result;
    }

    @Override
    public void write(MultiValueMap<String,?> t, MediaType contentType, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        throw new UnsupportedOperationException();
    }

对于多部分/表单数据,我在CustomConverter类中总是得到一个空白负载。

我还尝试添加一个多部分解析器,如下所示

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> but it has the same result.

我在stackoverflow Spring Integrdsl上关注了一个类似的问题——HTTP入站网关使用multipart/form-data。但对我来说它不起作用。

多部分/表单数据负载

POST / HTTP/1.1
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: d24d89ef-c52b-492a-96b9-6ef6807e8d1a
Host: localhost:9090
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------------------865732735860935509694157
Content-Length: 217

----------------------------865732735860935509694157
Content-Disposition: form-data; name=""; filename="testfile.txt"
Content-Type: text/plain

testcontent
----------------------------865732735860935509694157--

期待您的光临。

共有1个答案

元嘉木
2023-03-14

我认为您需要抛弃您的定制转换器,转而使用现有的现成的多部件formhttpmessageconverter,它在任何

既然你说你用的是Spring Boot,那么你就不需要用multipartResolver做任何事情了-它是在MultipartAutoConfiguration中为我们自动配置的。

如果这对你仍然不起作用,我很乐意研究一下你的项目的一个简单而简短的版本,可以使用、复制和可能的修复。

不相关:任何理解为什么使用XML配置的机会,但不是Java

 类似资料:
  • 我想通过超文本传输协议使用multipart/form-data inboud网关。第一部分是json对象,我想按内容类型将其序列化为对象:应用程序/json。第二部分是pdf文件。是否可以简单地序列化?我需要我的自定义消息转换器吗? 原始请求: HTTP Inboud网关 编辑: 我已经在Spring启动2.0.3上尝试过了。释放。它似乎不适用于。在有效负载中,我总是看到空的LinkedMult

  • 我尝试使用以下代码,得到了回应:状态:405方法不允许。这是我的Http请求:http://localhost:8090/services/test?name=test.代码或http请求有什么问题?

  • 我不熟悉Spring集成。我正在尝试使用http入站网关构建一个简单的应用程序。下面是我得到的运行时异常。 下面是代码文件。 波约 服务 } 服务激活器 } 存储库 请帮助我,我正在试图找到异常发生的原因,但无法解决。提前谢谢。 集成文件。

  • 我有一个http出站网关,它将json消息发布到rest服务,现在rest将以json消息类型的http错误状态响应,以防我们的应用程序捕获任何错误。在将json消息发布到rest服务并获得http成功状态的愉快场景中,我们的应用程序也应该捕获json消息。 现在我通过Spring集成实现了什么,我能够发送消息并获得成功响应并捕获它,但在错误状态下Spring行为会抛出异常,我如何更改行为? 如果

  • 我正在尝试将spring集成配置为向队列发送消息,然后接收消息,即非常简单的事情: 我认为解耦所必需的是在流程的两端都有一个消息网关。因此,我的第一次尝试(有效)如下所示: 其中MessageReceiverHandler()是扩展AbstractMessageHandler的bean。 所以上面我们有一个用于出站消息的消息网关。我假设我们也应该有一个用于入站消息的网关,允许我们将传入消息处理与应

  • 我遇到了一个问题,我无法在我的资源中获取我的表单,变量总是为空 我的资源: 表单模型 我的取货请求: 和我的HttpClient: 为了确保我正在使用代理进行测试并且请求实际上是好的:变量文件名和徽标始终为空。 这是我的绒球.xml: 我不知道问题出在哪里。 我已经看过了多部分的官方resteasy文档,看不出问题在哪里。我已经用MultipartFormDataInput测试过,所有部分都是空的