Spring-Integration: int:http:inbound-channel-adapter выдает 403 после обновления весенней загрузки до 1.4

После обновления Spring-Boot с версии 1.3.7.RELEASE до 1.4.0.RELEASE у меня возникла проблема: при вызове службы отдыха с помощью адаптера входящего канала она выдает ошибку HttpClientErrorException.

Конфигурация inbound-channel-adapter:

<int-http:inbound-channel-adapter
        channel="api_app_integration_request_channel" 
        supported-methods="PUT" 
        path="/process/ticket"
        request-payload-type="*.model.Ticket"
        header-mapper="headerMapper"
        error-channel="internal-client-rest-ticket-error-channel"
    >
        <int-http:request-mapping consumes="application/json" />
    </int-http:inbound-channel-adapter>

Restservice-Call:

private static final String URL = "http://localhost:8080/process/ticket";
public void openTicket(final Profile profile, final Ticket ticket) {
        final HttpHeaders headers = new HttpHeaders();
        headers.set(Profile.PROFILE, profile.toString());
        final HttpEntity<Ticket> entity = new HttpEntity<Ticket>(ticket, headers);
        template.exchange(URL, HttpMethod.PUT, entity, Ticket.class);
    }

Исключение:

org.springframework.web.client.HttpClientErrorException: 403 null
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:667)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:620)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:498)
    at *.client.rest.simulator.ProblemReporter.openTicket(ProblemReporter.java:28)
    at *.client.SassRestSimulatorApplication.lambda$0(SassRestSimulatorApplication.java:96)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at java.util.stream.SliceOps$1$1.accept(SliceOps.java:204)
    at java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1356)
    at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
    at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at *.client.SassRestSimulatorApplication.executeApplication(SassRestSimulatorApplication.java:96)
    at *.client.SassRestSimulatorApplication.main(SassRestSimulatorApplication.java:47)

Вывод отладки

2016-08-07 18:56:24.022 DEBUG 16288 --- [           main] o.s.web.client.RestTemplate              : Created PUT request for "http://localhost:8080/process/ticket"
2016-08-07 18:56:24.180 DEBUG 16288 --- [           main] o.s.web.client.RestTemplate              : Setting request Accept header to [application/json, application/*+json]
2016-08-07 18:56:24.223 DEBUG 16288 --- [           main] o.s.web.client.RestTemplate              : Writing [Ticket# 1: [SIDE1-BS1-SP1] [SIDE1-BS1-SP1] [emergency] [NEW] Urgend problem. Fix immediately or revenue will be lost!] using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@18918d70]
2016-08-07 18:56:24.331 DEBUG 16288 --- [           main] o.s.web.client.RestTemplate              : PUT request for "http://localhost:8080/process/ticket" resulted in 403 (null); invoking error handler

Я пробовал int-http:inbound-gateway НО с тем же результатом.

При доступе к сервису напрямую через Postman я получаю 403 - Доступ запрещен, и журнал не найден:

введите здесь описание изображения

Я немного удивлен отказом в доступе, я не использую какую-либо систему безопасности.

Под Spring-Boot 1.3.7.RELEASE работает нормально:

Вывод журнала:

2016-08-07 20:03:23.098 TRACE 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Bound request context to thread: org.apache.catalina.connector.RequestFacade@32818b2d
2016-08-07 20:03:23.098 DEBUG 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing PUT request for [/process/ticket]
2016-08-07 20:03:23.098 TRACE 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@23764bec] in DispatcherServlet with name 'dispatcherServlet'
2016-08-07 20:03:23.098 TRACE 9372 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping  : No handler mapping found for [/process/ticket]
2016-08-07 20:03:23.098 TRACE 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@5fa0d972] in DispatcherServlet with name 'dispatcherServlet'
2016-08-07 20:03:23.098 DEBUG 9372 --- [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /process/ticket
2016-08-07 20:03:23.098 DEBUG 9372 --- [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/process/ticket]
2016-08-07 20:03:23.098 TRACE 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.integration.http.inbound.IntegrationRequestMappingHandlerMapping@64dfb31d] in DispatcherServlet with name 'dispatcherServlet'
2016-08-07 20:03:23.098 TRACE 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@35467187]
2016-08-07 20:03:23.098 TRACE 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@52466d8b]
2016-08-07 20:03:23.100 DEBUG 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2016-08-07 20:03:23.100 TRACE 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@32818b2d
2016-08-07 20:03:23.100 DEBUG 9372 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Successfully completed request
2016-08-07 20:03:23.119 DEBUG 9372 --- [ sassExecutor-1] o.s.web.client.RestTemplate              : Created PUT request for "http://localhost:8080/process/ticket"
2016-08-07 20:03:23.120 DEBUG 9372 --- [ sassExecutor-1] o.s.web.client.RestTemplate              : Writing [Ticket# 666: [SIDE1-BS1-SP1] ] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4d3ce1c0]
2016-08-07 20:03:23.126 TRACE 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Bound request context to thread: org.apache.catalina.connector.RequestFacade@32818b2d
2016-08-07 20:03:23.127 DEBUG 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing PUT request for [/process/ticket]
2016-08-07 20:03:23.128 TRACE 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@23764bec] in DispatcherServlet with name 'dispatcherServlet'
2016-08-07 20:03:23.128 TRACE 9372 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping  : No handler mapping found for [/process/ticket]
2016-08-07 20:03:23.128 TRACE 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@5fa0d972] in DispatcherServlet with name 'dispatcherServlet'
2016-08-07 20:03:23.128 DEBUG 9372 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /process/ticket
2016-08-07 20:03:23.129 DEBUG 9372 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/process/ticket]
2016-08-07 20:03:23.129 TRACE 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.integration.http.inbound.IntegrationRequestMappingHandlerMapping@64dfb31d] in DispatcherServlet with name 'dispatcherServlet'
2016-08-07 20:03:23.129 TRACE 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@35467187]
2016-08-07 20:03:23.129 TRACE 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@52466d8b]
2016-08-07 20:03:23.130 DEBUG 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2016-08-07 20:03:23.130 TRACE 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@32818b2d
2016-08-07 20:03:23.130 DEBUG 9372 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Successfully completed request
2016-08-07 20:03:23.134 DEBUG 9372 --- [ sassExecutor-1] o.s.web.client.RestTemplate              : PUT request for "http://localhost:8080/process/ticket" resulted in 200 (OK)
Ticket# 666: [SIDE1-BS1-SP1] [SIDE1-BS1-SP1] [low] [DECRYPTED] Ich bin von Postman gesendet worden

====== РЕДАКТИРОВАТЬ =======

В Spring Boot 1.4.0 я получаю следующую отладочную информацию при вызове остальной службы:

2016-08-08 19:21:35.382 DEBUG 8268 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer      : Received [PUT /process/ticket HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 206
Cache-Control: no-cache
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
profile: 192.168.56.102:10000
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

{"ticketId":666,"issueDateTime":"2016-06-27","description":"Ich bin von Postman gesendet worden","sender":"SIDE1-BS1-SP1","receiver":"SIDE1-BS1-SP1","priority":"low","secured":"NEW","mimeType":"text/plain"}]
2016-08-08 19:21:35.383 DEBUG 8268 --- [nio-8080-exec-2] o.a.c.authenticator.AuthenticatorBase    : Security checking request PUT /process/ticket
2016-08-08 19:21:35.383 DEBUG 8268 --- [nio-8080-exec-2] org.apache.catalina.realm.RealmBase      :   No applicable constraints defined
2016-08-08 19:21:35.383 DEBUG 8268 --- [nio-8080-exec-2] o.a.c.authenticator.AuthenticatorBase    :  Not subject to any constraint
2016-08-08 19:21:35.383 DEBUG 8268 --- [nio-8080-exec-2] o.apache.catalina.core.StandardWrapper   :   Returning non-STM instance
2016-08-08 19:21:35.384 DEBUG 8268 --- [nio-8080-exec-2] o.apache.coyote.http11.Http11Processor   : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@16ab5cb1:org.apache.tomcat.util.net.NioChannel@5a719bf2:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8080 remote=/0:0:0:0:0:0:0:1:57863]], Status in: [OPEN_READ], State out: [OPEN]

Spring-Boot-Starter:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-http</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

====

Пример приложения:

В Spring-Boot 1.3.7 Works, 1.4.0 Ошибка, как описано. Ссылка на Dropbox: ссылка


person Michael Hegner    schedule 06.08.2016    source источник
comment
Посмотрите логи на стороне сервера. При необходимости включите ведение журнала DEBUG/TRACE и просмотрите сопоставления пути/конечной точки.   -  person Gary Russell    schedule 07.08.2016
comment
Добавлен вывод отладки. Что изменилось между 1.3.х и 1.4.х, что на 1.3 работает, а на 1.4 нет?   -  person Michael Hegner    schedule 07.08.2016
comment
Для меня это похоже на то, что адаптер входящего канала работает неправильно. Во-первых, я не знаю, почему я получаю 403 (без использования безопасности), на стороне сервера нет ведения журнала, я не могу вызвать его ни через RestTemplate, ни через Postman. Вернувшись к Spring Boot 1.3.7, все в порядке. То же самое с входящим шлюзом. :-(   -  person Michael Hegner    schedule 07.08.2016
comment
Пожалуйста, поделитесь похожими журналами TRACE с сервера, когда вы находитесь в Boot 1.4, поэтому Spring Integration 4.3. И да: вы можете принудительно установить версию Spring Integration в своем pom на <spring-integration.version>4.2.9.RELEASE</spring-integration.version>, чтобы изолировать проблему именно в Spring Integration, если что.   -  person Artem Bilan    schedule 08.08.2016
comment
Также сравните журналы между 1.3 и 1.4 — похоже, что SpringBootWebSecurityConfiguration каким-то образом вызывается — возможно, через @EnableWebSecurity.   -  person Gary Russell    schedule 08.08.2016
comment
Привет, Гэри, спасибо за ответ, у меня нет ни реализованной, ни настроенной системы безопасности. @EnableWebSecurity не найден.   -  person Michael Hegner    schedule 08.08.2016
comment
Привет, Артем, если я принудительно использую Spring-Integration 4.2.9, я получаю NoClassDefFoundError: java.lang.NoClassDefFoundError: org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping Я пытаюсь войти с помощью spring 1.4 (application.properties => logging.level.root=TRACE), но после запуска и вызова службы через почтальона я больше не получаю никаких журналов. Только 403 с сервера   -  person Michael Hegner    schedule 08.08.2016
comment
Ладно, у меня есть запись. Я думаю, это может помочь, я сделал новый раздел EDIT в вопросе.   -  person Michael Hegner    schedule 08.08.2016
comment
Пожалуйста, не стесняйтесь, если вам нужна дополнительная информация.   -  person Michael Hegner    schedule 10.08.2016


Ответы (1)


Что ж, поскольку у вас есть Spring Boot, действительно похоже, что spring-security в пути к классам вызывает автоматическую настройку безопасности (SecurityAutoConfiguration).

Попробуйте включить опцию --debug при запуске приложения и посмотреть в автоконфигурации слово "безопасность".

OTOH вы показали первые логи для Tomcat, но они ничего не говорят о дальнейшем процессе с DispatcherServlet.

Можем ли мы увидеть эти журналы?

ОБНОВЛЕНИЕ

Спасибо за образец заявления. К сожалению, это работает для меня:

:: Spring Boot ::        (v1.4.0.RELEASE)

2016-08-11 11:35:36.762  INFO 8636 --- [           main] com.example.RestSimulatorApplication     : Starting RestSimulatorApplication on HOME with PID 8636 (D:\SpringIO\Spring140IntegrationTest\target\classes started by abilan in D:\SpringIO\Spring140IntegrationTest)
...
'dispatcherServlet': initialization started
2016-08-11 11:35:39.694  INFO 8636 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 11 ms
Ticket# 1: [emergency] [NEW] Urgend problem. Fix immediately or revenue will be lost!
Ticket# 2: [medium] [NEW] There is an issue; take a look whenever you have time.
Ticket# 3: [emergency] [NEW] Urgend problem. Fix immediately or revenue will be lost!
Ticket# 4: [medium] [NEW] There is an issue; take a look whenever you have time.

Я пробовал это на Windows и Mac с такими же хорошими результатами.

Может у вас на машине какой-нибудь Fire Wall с правилом не разрешать запросы с каким-то заголовком или еще что?..

person Artem Bilan    schedule 10.08.2016
comment
Привет, Артем, по следующей ссылке вы можете увидеть отчет об автоконфигурации. У меня нет библиотеки безопасности в пути к классам (pom.xml), полнотекстовый поиск в eclipse с безопасностью по ключевым словам не имеет совпадений. Ссылка на Dropbox: dropbox.com/sh/la7ff5mwl4ga79k/AAAoS7Bj0b4tzeWNUZKoTOg-a?dl= 0 - person Michael Hegner; 10.08.2016
comment
Я также добавил ведение журнала при запуске tomcat - person Michael Hegner; 10.08.2016
comment
Хм. Это не помогает. Извиняюсь. Интересно, можете ли вы поделиться каким-нибудь простым приложением Spring Boot, чтобы играть с нашей стороны локально. - person Artem Bilan; 10.08.2016
comment
Привет, Артем, спасибо, я попробую написать небольшую программу для имитации такого поведения. - person Michael Hegner; 10.08.2016
comment
Пример приложения добавлен в дропбокс. (Настроено с 1.3.7, просто попробуйте приложение, затем переключитесь на 1.4.0, больше не работает) - person Michael Hegner; 10.08.2016
comment
Пожалуйста, найдите ОБНОВЛЕНИЕ в моем ответе. Без неудач я не могу помочь вам. Извините :-( - person Artem Bilan; 11.08.2016
comment
Я могу подтвердить, что это работает и для меня с загрузкой 1.4. Ticket# 1: [low] [NEW] Some minor problems have been found. - person Gary Russell; 11.08.2016
comment
Большое спасибо за опробование приложения. Меня это действительно удивило, НО приятно знать, что это работает. Я удалил весь свой m2-репозиторий и заново создал его, и теперь он работает и у меня. Ошибка - 403-Отказано в доступе - действительно вводила меня в заблуждение, и я не ожидал такой проблемы. - person Michael Hegner; 11.08.2016