spring-hateoas 的 HAL 风格渲染问题

HAL-style rendering issues with spring-hateoas

这次真的是一头雾水,一头雾水... 我正在开发一个 spring-boot (1.5.3) 应用程序,使用 spring-hateoas 库公开一个具有 HAL 风格的 REST API。一些端点已经正常工作并且 return HAL 链接。目前我正在尝试将另一个端点更改为也 return 使用 HAL 的响应,但结果以 "collection+json" 样式序列化。

到目前为止我发现了什么: spring 上下文中有 3 个 ObjectMapper 实例:

我用所有这三个转换了响应,发现前两个产生 "collection+json" 输出("links""rel"),第三个产生预期的 HAL 样式( "_links" 没有 "rel").

为什么有三个?我如何检查和控制这些 objectMappers 中的哪一个用于呈现响应?我的其他端点怎么可能 return 预期格式?


这是我的简化代码,如果您对它感兴趣的话:

@RestController
public class SearchController{

    @RequestMapping(value = "/search", produces = { "application/hal+json" }, method = RequestMethod.GET)
    public ResponseEntity<SearchResponse> search(...){
        SearchResponse searchResponse = ...; // search & build response
        return new ResponseEntity<>(searchResponse, HttpStatus.OK);
    }
}

public class SearchResponse {

    @JsonProperty("_meta")
    private PageSortInfo meta;

    @JsonUnwrapped
    private Resources<Resource<SearchResultItem>> resultlist;

    ...// getters & setters
}

响应应该如下所示:

{
    "_meta" : {
      ...
    },
    "_embedded" : {
      "searchResultItemList" : [ {
        ...,
        "_links" : {
          "self" : {
            "href" : "..."
          }
        }
      },
      ...
      ]
    },
    "_links" : {
      "self" : {
        "href" : "http://localhost:8882/api/search"
      }
    }
}

好吧,经过又一天的挖掘 google 搜索结果、sprint-boot 代码和大量的反复试验,我终于找到了答案,这当然是微不足道的:

Spring 将选择 MessageConverter 用于将响应对象转换为适当的格式,方法是将已注册的转换器与对象的类型相匹配(在我的例子中为 SearchResponse)和响应类型("application/hal+json" 对我来说)。仅当响应对象的类型为 ResourceSupport 时,才会选择 halJacksonHttpMessageConverter。所以我所要做的就是让我的 SearchResponse 扩展 ResourceSupport 并且我得到了预期的响应格式。

public class SearchResponse extends ResourceSupport {...}