在春天hateoas定制json输出

时间:2017-01-04 12:59:06

标签: java spring-boot spring-hateoas

我正在建造基于api的弹簧(弹簧靴)。 是否可以从hateoas库json输出中删除_embedded关键字?我希望我的项目集合显示在_embedded之下。我知道它违反了规范但是我想知道是否有简单的方法来定制输出但仍然使用spring hateoas?如果不可能,我应该使用不同的api构建库,在生成的输出方面允许更大的灵活性,那么你会建议什么?

我的控制器代码:

@RequestMapping(method = RequestMethod.GET, produces = "application/json")
HttpEntity<Resources<Author>> getAllAuthors() {
 Resources<Author> resources = new Resources<>(this.authorsService.findAll());
 resources.add(this.entityLinks.linkToCollectionResources(Author.class));
 return new ResponseEntity<>(resources, HttpStatus.OK)

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您需要编写一个自定义的序列化程序,该序列化程序将Hateoas对象转换为所需的对象。

请参见分页自定义响应示例:

@Component
public class CustomPageResponseSerializer extends JsonSerializer<Page> {

    @Autowired
    private PagedResourcesAssembler<Page> pagedResourcesAssembler;

    @Override
    public void serialize(Page page, JsonGenerator gen, SerializerProvider provider) throws IOException {
        PagedModel pageModel = pagedResourcesAssembler.toModel(page);

        CustomPageResponse pageResponse = CustomPageResponse.builder()
                .data(page.toList())
                .page(PaginationDataResponse.builder()
                        .page(page.getNumber())
                        .pageSize(page.getSize())
                        .totalPages(page.getTotalPages())
                        .totalElements(Math.toIntExact(page.getTotalElements()))
                        .links(
                                PaginationLinksResponse.builder()
                                        .first(getLink(pageModel.getLink(IanaLinkRelations.FIRST)))
                                        .last(getLink(pageModel.getLink(IanaLinkRelations.LAST)))
                                        .previous(getLink(pageModel.getPreviousLink()))
                                        .next(getLink(pageModel.getNextLink()))
                                        .build()
                        )
                        .build())
                .build();

        new PaginationObjectMapper().writeValue(gen, pageResponse);
    }

    private String getLink(Optional link) {
        return link.isPresent() ? ((Link)link.get()).getHref() : "";
    }
}
相关问题