#spring-integration #spring-hateoas #spring-integration-http
#spring-интеграция #spring-hateoas #spring-integration-http
Вопрос:
Я установил для следующего свойства значение true «spring.hateoas.use-hal-as-default-json-media-type» и добавил org.springframework.boot:spring-boot-starter-hateoas в качестве зависимости.
Код
@Bean
public IntegrationFlow myUserFlow() {
return IntegrationFlows
.from(Http.inboundGateway("/user")
.requestMapping(r -> r.methods(HttpMethod.GET))
.get()
)
.handle((payload, headers) -> new MyUser("Joe Blogs")
.add(Link.of("http://localhost:8080/account", LinkRelation.of("account"))))
.get();
}
Ответ
GET http://localhost:8080/user
HTTP/1.1 200
connection: Keep-Alive, keep-alive
Content-Type: application/hal json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 11 Jan 2021 18:31:13 GMT
Keep-Alive: timeout=60
{
"name": "Joe Blogs",
"links": [
{
"rel": "account",
"href": "http://localhost:8080/account"
}
]
}
Response code: 200; Time: 19ms; Content length: 87 bytes
Я ожидал, что ответ будет возвращен в формате HAL, например
{
"name": "Joe Blogs",
"_links": [
{
"account":{
"href": "http://localhost:8080/account"
}
}
]
}
Почему это не так? И как я могу это сделать?
Пример приложения: https://github.com/kevvvvyp/si-hateoas-demo
Ответ №1:
Решение выглядит так:
public IntegrationFlow myUserFlow(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
return IntegrationFlows
.from(Http.inboundGateway("/user")
.messageConverters(requestMappingHandlerAdapter.getMessageConverters().toArray(HttpMessageConverter[]::new))
Проблема в том, что адаптеры HTTP-каналов Spring Integration не настраиваются автоматически при загрузке Spring, и они определенно не знают о вашей настройке HAL.
Итак, нам нужно подождать, пока RequestMappingHandlerAdapter
он не будет обработан Spring Boot и настроен на настройку hateoas. Затем мы берем его конвертеры и вводим их в наш Http.inboundGateway()
.
Я хотел сказать, что мы можем подумать о чем-то автоматическом в Spring Boot, чтобы настроить эту настройку, но поскольку мы действительно говорим не о какой-то инфраструктуре, такой как MVC @RequestMapping
, а о некоторых конкретных компонентах, вероятно, лучше придерживаться явной конфигурации.
Я не уверен, хотя почему мы не можем использовать HttpMessageConverters
вместо этого, но похоже RequestMappingHandlerAdapter
, что это настроено позже, когда этот вид beans ( IntegrtionFlow
) уже проанализирован и создан.