Spring 集成 - 无法使用 Http 入站网关处理 multipart/form-data
Spring Integration - Unable to process multipart/form-data with Http-inbound Gateway
这是一个 Spring 集成(基于 Spring 启动)项目,我已经配置 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();
}
对于 multipart/form-data,我总是在 CustomConverter class 中收到空白负载。
我也试过如下添加 multipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> but it has the same result.
我在 Whosebug 上关注了一个类似的问题。
但对我来说它不起作用。
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--
感谢期待。
我认为你需要放弃你的 CustomConverter
以支持现有的开箱即用 - MultipartAwareFormHttpMessageConverter
,它实际上在任何 <int-http:inbound-gateway>
bean 中默认显示定义。
既然你说你使用 Spring 引导,那么你不需要对 multipartResolver
做任何事情 - 它是自动配置的,开箱即用MultipartAutoConfiguration
.
如果这对您仍然不起作用,我很乐意查看您的项目的一个简单的简短版本,以供使用、重现和可能的修复。
不相关:是否有机会理解为什么使用 XML 配置,而不是 Java & 注释甚至 Java DSL?
这是一个 Spring 集成(基于 Spring 启动)项目,我已经配置 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();
}
对于 multipart/form-data,我总是在 CustomConverter class 中收到空白负载。
我也试过如下添加 multipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> but it has the same result.
我在 Whosebug
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--
感谢期待。
我认为你需要放弃你的 CustomConverter
以支持现有的开箱即用 - MultipartAwareFormHttpMessageConverter
,它实际上在任何 <int-http:inbound-gateway>
bean 中默认显示定义。
既然你说你使用 Spring 引导,那么你不需要对 multipartResolver
做任何事情 - 它是自动配置的,开箱即用MultipartAutoConfiguration
.
如果这对您仍然不起作用,我很乐意查看您的项目的一个简单的简短版本,以供使用、重现和可能的修复。
不相关:是否有机会理解为什么使用 XML 配置,而不是 Java & 注释甚至 Java DSL?