[英]Problem to Understand correct configuration for Http GET Requests on Spring Integration
目前我正在研究 spring 集成並面臨一個問題。
代碼如下。 對於端點上的空請求 (GET METHOD),響應是 500 錯誤。 POST 方法工作正常,但我發送了一個空的 json。 它是否與PayloadType
類(即空類)有關。
package org.nanotek.configuration.csv;
import org.nanotek.JsonMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway;
import org.springframework.integration.http.inbound.RequestMapping;
import org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler;
import org.springframework.messaging.MessageChannel;
import org.springframework.web.client.RestTemplate;
@Configuration
@EnableConfigurationProperties
public class InstrumentTypeIntegrationConfiguration {
@Value("${server.port}")
private String serverPort;
@Value("${csv-endpoint.instrument-type}${csv-endpoint.next}")
private String nexEndpoint;
public InstrumentTypeIntegrationConfiguration() {
}
@Bean
@Qualifier(value="baseRestTemplate")
RestTemplate baseRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
@Bean
HttpRequestExecutingMessageHandler csvNextMessageHandler
(@Autowired @Qualifier("baseRestTemplate") RestTemplate baseTemplate) {
String uriLocation = new StringBuilder()
.append("http://127.0.0.1")
.append(":")
.append(serverPort)
.append(nexEndpoint).toString();
return new HttpRequestExecutingMessageHandler(uriLocation , baseTemplate);
}
@Bean
RequestMapping mapping() {
RequestMapping mapping = new RequestMapping();
mapping.setMethods(new HttpMethod[] {HttpMethod.GET, HttpMethod.POST});
mapping.setConsumes(MediaType.APPLICATION_JSON_VALUE);
mapping.setProduces(MediaType.APPLICATION_JSON_VALUE);
mapping.setPathPatterns("/init");
return mapping;
}
@Bean
@Qualifier("startChannel")
MessageChannel startChannel() {
return new DirectChannel();
}
@Bean
@Qualifier("responseChannel")
MessageChannel responseChannel() {
return new DirectChannel();
}
@Bean
@Qualifier("httpGate")
public HttpRequestHandlingMessagingGateway httpGate() {
HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway(true);
gateway.setRequestMapping(mapping());
gateway.setRequestPayloadTypeClass(JsonMessage.class);
gateway.setReplyTimeout(10000);
gateway.setRequestChannel(startChannel());
gateway.setReplyChannel(responseChannel());
return gateway;
}
@Bean
public IntegrationFlow flowRequestHttp() {
return IntegrationFlows
.from(startChannel())
.channel(responseChannel())
.get();
}
}
這是堆棧跟蹤
{
"timestamp": 1583019522673,
"status": 500,
"error": "Internal Server Error",
"message": "Content-Type cannot contain wildcard type '*'",
"trace": "java.lang.IllegalArgumentException: Content-Type cannot contain wildcard type '*'\n\tat org.springframework.util.Assert.isTrue(Assert.java:118)\n\tat org.springframework.http.HttpHeaders.setContentType(HttpHeaders.java:949)\n\tat org.springframework.http.converter.FormHttpMessageConverter.writeForm(FormHttpMessageConverter.java:388)\n\tat org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:365)\n\tat org.springframework.integration.http.converter.MultipartAwareFormHttpMessageConverter.write(MultipartAwareFormHttpMessageConverter.java:133)\n\tat org.springframework.integration.http.converter.MultipartAwareFormHttpMessageConverter.write(MultipartAwareFormHttpMessageConverter.java:51)\n\tat org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway.writeResponse(HttpRequestHandlingMessagingGateway.java:183)\n\tat org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway.handleRequest(HttpRequestHandlingMessagingGateway.java:142)\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:53)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:634)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:741)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:108)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n",
"path": "/init"
}
我使用的是郵遞員來測試端點樣品波紋管收集在這里。
{
"name": "init_integration_request",
"protocolProfileBehavior": {
"disableBodyPruning": true
},
"request": {
"method": "GET",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "graphql",
"graphql": {
"query": "",
"variables": ""
}
},
"url": {
"raw": "http://localhost:8080/init?application/json",
"protocol": "http",
"host": [
"localhost"
],
"port": "8080",
"path": [
"init"
],
"query": [
{
"key": "application/json",
"value": ""
}
]
}
},
"response": []
}
您不使用Accept
請求標頭的問題。 因此,一個HttpRequestHandlingMessagingGateway
回退到MediaType.ALL
,這是禁止響應的Content-Type
。
必須在 Spring Framework 中修復FormHttpMessageConverter
以回退到此轉換器的默認contentType
。 與我們在許多其他HttpMessageConverter
相同。 隨時提出問題以請求修復該問題: https : //github.com/spring-projects/spring-framework/issues !
無論如何,我認為multipart/form-data
不是您期望的響應。 但是由於沒有合理的Accept
請求標頭,框架不知道如何處理來自您的流的回復。 因此,請考慮使其保持一致或僅轉換響應的有效負載,然后再將其發送到回復中的 HTTP 入站網關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.