有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

SpringHateOAS中java自定义json输出

我正在构建基于spring(spring boot)的api。 是否可以从hateoas库json输出中删除_嵌入式关键字?我希望我的项目集合不显示在嵌入的_下。我知道它违反了规范,但是我想知道是否有简单的方法来定制输出,但仍然使用SpringHateoas?在不可能的情况下,我是否应该使用不同的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) 个答案

  1. # 1 楼答案

    您需要编写一个自定义序列化程序,将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() : "";
        }
    }