Проблема, чтобы понять правильную конфигурацию для запросов Http GET на Spring Integration - PullRequest
0 голосов
/ 28 февраля 2020

В настоящее время я изучаю интеграцию пружин и столкнулся с проблемой.

Код приведен ниже. Ответ - ошибка 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": []
        }

1 Ответ

0 голосов
/ 02 марта 2020

Проблема в том, что вы не используете заголовок запроса Accept. Таким образом, HttpRequestHandlingMessagingGateway возвращается к MediaType.ALL, который запрещен Content-Type для ответа.

FormHttpMessageConverter должен быть исправлен в Spring Framework для возврата к стандартному contentType для этот конвертер. То же самое, что мы имеем во многих других HttpMessageConverter подразумеваемых. Не стесняйтесь поднимать вопрос, чтобы запросить исправление: https://github.com/spring-projects/spring-framework/issues!

В любом случае, я думаю, что multipart/form-data - это не то, что вы ожидаете в качестве ответа. Но так как нет разумного Accept заголовка запроса, фреймворк не знает, что делать с ответом из вашего потока. Итак, подумайте о том, чтобы сделать его согласованным или просто преобразовать полезную нагрузку для ответа, прежде чем отправлять его в этот входящий HTTP-шлюз в ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...