Как вызвать RESTful API и обработать ответ с помощью Spring Integration WS

#java #spring-boot #spring-integration

#java #пружинный ботинок #весенняя интеграция

Вопрос:

Предположим, у меня есть еще один проект Spring Boot с таким контроллером:

 @RestController
public class TestController {

    @GetMapping("/test")
    public String test(@RequestBody String body) {
        log.info("/test: {}", body);
        return "[CHANGED] "   body;
    }
}
 

Моя цель — перенаправить сообщения с канала на конечную точку выше. Как мне это сделать правильно?
Я выяснил, что у SI есть модуль Spring Integration Web Services для подобных вещей, но я не могу привести рабочий пример. Вот мой интеграционный поток:

 public IntegrationFlow flow() {
    return IntegrationFlows.from(/* irrelevant */)
            .log(Object::toString)
            .handle(Ws.simpleOutboundGateway()
                    .uri("http://localhost:8080/test")
                    .requestCallback(message -> {
                        log.info("[REQUEST-CALLBACK] - Got response: {}", message);
                    })
            )
            .get();
}

 

Приложение не запускается с java.lang.NoClassDefFoundError: javax/xml/soap/MessageFactory ошибкой, поэтому, возможно, я не предоставил достаточно параметров исходящему шлюзу WS.

Я погуглил ошибку и обнаружил, что добавление этой зависимости должно все исправить:

compile group: 'javax.xml.soap', name: 'javax.xml.soap-api', version: '1.4.0'

Но этого не произошло. Я продолжаю получать ошибки о пропущенных классах, просто разные.

Мой раздел зависимостей выглядит следующим образом:

 dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-json:2.4.0'
    implementation 'org.springframework.integration:spring-integration-core:5.4.1'
    implementation 'org.springframework.integration:spring-integration-ws:5.4.1'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.3'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.3'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}
 

P.S. Извините, если ответ находится где-то на поверхности (в Интернете). Все еще учусь, не могу исправить это сам.

UPD: Java 11

Ответ №1:

Вероятно, вы неправильно прочитали документы: https://docs.spring.io/spring-integration/docs/current/reference/html/ws.html#ws . Модуль WS Spring Integration полностью основан на проекте Spring WS, целью которого является именно SOAP, а не REST. Пожалуйста, ознакомьтесь с соответствующими спецификациями, чтобы увидеть разницу.

Чтобы вызвать службу REST, вам нужен HTTP-модуль Spring Integration: https://docs.spring.io/spring-integration/docs/current/reference/html/http.html#http