如何将 Spring 集成 Http.inboundGateway 到 return HAL Json?
How to get Spring Integration Http.inboundGateway to return HAL Json?
我将以下 属性 设置为 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"
}
}
]
}
为什么不是这样?我怎样才能做到这一点?
解决方法是这样的:
public IntegrationFlow myUserFlow(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
return IntegrationFlows
.from(Http.inboundGateway("/user")
.messageConverters(requestMappingHandlerAdapter.getMessageConverters().toArray(HttpMessageConverter[]::new))
问题是因为 Spring 集成 HTTP 通道适配器不是由 Spring 引导自动配置的,它们绝对不知道您的 HAL 自定义。
所以,我们需要等到 RequestMappingHandlerAdapter
被 Spring 引导和 hateoas 定制处理。然后我们获取它的转换器并将它们注入我们的 Http.inboundGateway()
.
我想说的是,我们可能会考虑在 Spring Boot 中自动进行一些自定义操作,但是因为我们真的不讨论像 MVC @RequestMapping
这样的基础设施,而是一些具体的 bean,坚持使用显式配置可能真的更好。
我不确定为什么我们不能使用 HttpMessageConverters
,但看起来 RequestMappingHandlerAdapter
是稍后配置的,当这种 bean (IntegrtionFlow
) 有已经解析和创建。
我将以下 属性 设置为 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"
}
}
]
}
为什么不是这样?我怎样才能做到这一点?
解决方法是这样的:
public IntegrationFlow myUserFlow(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
return IntegrationFlows
.from(Http.inboundGateway("/user")
.messageConverters(requestMappingHandlerAdapter.getMessageConverters().toArray(HttpMessageConverter[]::new))
问题是因为 Spring 集成 HTTP 通道适配器不是由 Spring 引导自动配置的,它们绝对不知道您的 HAL 自定义。
所以,我们需要等到 RequestMappingHandlerAdapter
被 Spring 引导和 hateoas 定制处理。然后我们获取它的转换器并将它们注入我们的 Http.inboundGateway()
.
我想说的是,我们可能会考虑在 Spring Boot 中自动进行一些自定义操作,但是因为我们真的不讨论像 MVC @RequestMapping
这样的基础设施,而是一些具体的 bean,坚持使用显式配置可能真的更好。
我不确定为什么我们不能使用 HttpMessageConverters
,但看起来 RequestMappingHandlerAdapter
是稍后配置的,当这种 bean (IntegrtionFlow
) 有已经解析和创建。