Nous appelons ce scénario comme proxy HTTP et avoir un test de cas sur la question: https://github.com/spring-projects/spring-integration/blob/master/spring-integration-http/src/test/java/org/springframework/integration/http/dsl/HttpDslTests.java
Je viens de faire une enquête et voici ce que vous avez besoin:
IntegrationFlows
.from(Http.inboundGateway("/service")
.requestMapping(r -> r.params("name"))
.errorChannel("httpProxyErrorFlow.input"))
...
@Bean
public IntegrationFlow httpProxyErrorFlow() {
return f -> f
.transform(Throwable::getCause)
.<HttpClientErrorException>handle((p, h) ->
MessageBuilder.withPayload(p.getResponseBodyAsString())
.setHeader(HttpHeaders.STATUS_CODE, p.getStatusCode())
.build());
}
Nous devons gérer les erreurs en aval sur le niveau de la passerelle entrante. Pour cela, Spring Integration suggère la fonctionnalité errorChannel
.
Cette httpProxyErrorFlow
fournit une certaine logique à ce sujet. Tout d'abord nous savons que le message pour le errorChannel
est ErrorMessage
et son payload
est MessagingException
- à la suite de l'emballage HttpClientErrorException
dans le HttpRequestExecutingMessageHandler
. Donc, avec le .transform()
nous descendons à l'exception désirée et dans le .handle()
nous construisons un nouveau message basé sur le contenu HttpClientErrorException
.
Le HttpRequestHandlingMessagingGateway
est en mesure de traiter un tel message correctement et définir un code d'état souhaité à la réponse:
protected final Object setupResponseAndConvertReply(ServletServerHttpResponse response, Message<?> replyMessage) {
getHeaderMapper().fromHeaders(replyMessage.getHeaders(), response.getHeaders());
HttpStatus httpStatus = this.resolveHttpStatusFromHeaders(replyMessage.getHeaders());
if (httpStatus != null) {
response.setStatusCode(httpStatus);
}
http://docs.spring.io/spring-integration/docs/4.3.11.RELEASE/reference/html/http.html#http-response-statuscode
S'il vous plaît, trace la part de pile que vous voyez là avant erreur pour votre service, que 500 –