#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