当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot Data Rest中向HATEOAS响应添加更多信息

西门展
2023-03-14

我有以下REST控制器。

@RepositoryRestController
@RequestMapping(value = "/booksCustom")
public class BooksController extends ResourceSupport {

    @Autowired
    public BooksService booksService;

    @Autowired
    private PagedResourcesAssembler<Books> booksAssembler;

    @RequestMapping("/search")
    public HttpEntity<PagedResources<Resource<Books>>> search(@RequestParam(value = "q", required = false) String query, @PageableDefault(page = 0, size = 20) Pageable pageable) {
        pageable = new PageRequest(0, 20);

        Page<Books> booksResult = BooksService.findBookText(query, pageable);

        return new ResponseEntity<PagedResources<Resource<Books>>>(BooksAssembler.toResource(BooksResult), HttpStatus.OK);

    }

我的<代码>页

编辑:

型号:

@SolrDocument(solrCoreName = "Books_Core")
public class Books {
    @Field
    private String id;

    @Field
    private String filename;

    @Field("full_text")
    private String fullText;

    //Getters and setters omitted 
    ...
}

当搜索和SolrRepository被调用时(例如BooksService.findBookText(查询,可分页);)我得到这些对象。

然而,在我的REST回复中,我只看到了“内容”。我希望能够将“突出显示的”对象添加到REST响应中。看起来HATEOAS只发送“content”对象中的信息(请参见下面的对象)。

{
  "_embedded" : {
    "solrBooks" : [ {
      "filename" : "ABookName",
      "fullText" : "ABook Text"
    } ]
  },
  "_links" : {
    "first" : {
      "href" : "http://localhost:8080/booksCustom/search?q=ABook&page=0&size=20"
    },
    "self" : {
      "href" : "http://localhost:8080/booksCustom/search?q=ABook"
    },
    "next" : {
      "href" : "http://localhost:8080/booksCustom/search?q=ABook&page=0&size=20"
    },
    "last" : {
      "href" : "http://localhost:8080/booksCustom/search?q=ABook&page=0&size=20"
    }
  },
  "page" : {
    "size" : 1,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

这是支持BooksService的存储库,您可以全面了解它。服务所做的就是调用这个SolrCrudRepository方法

public interface SolrBooksRepository extends SolrCrudRepository<Books, String> {

    @Highlight(prefix = "<highlight>", postfix = "</highlight>", fragsize = 20, snipplets = 3)
    HighlightPage<SolrTestDocuments> findBookText(@Param("fullText") String fullText, Pageable pageable);

}

共有2个答案

蔺弘
2023-03-14

我正在使用页面

@RepositoryRestController
@RequestMapping(value = "/booksCustom")
public class BooksController extends ResourceSupport {

    @Autowired
    public BooksService booksService;

    @Autowired
    private PagedResourcesAssembler<Books> booksAssembler;

    @RequestMapping("/search")
    public HttpEntity<PagedResources<Resource<HighlightPage>>> search(@RequestParam(value = "q", required = false) String query, @PageableDefault(page = 0, size = 20) Pageable pageable) {

        HighlightPage solrBookResult = booksService.findBookText(query, pageable);
        Page<Books> highlightedPages = new PageImpl(solrBookResult.getHighlighted(), pageable, solrBookResult.getTotalElements());
        return new ResponseEntity<PagedResources<Resource<HighlightPage>>>(booksAssembler.toResource(highlightedPages), HttpStatus.OK); 
    }

可能是一种更好的方法,但是我找不到任何可以在不更改大量代码的情况下完成我想要它做的事情。希望这有所帮助!

长孙作人
2023-03-14

好的,我是这样做的:我写了我的HighlightPagedResources

public class HighlightPagedResources<R,T> extends PagedResources<R> {

    private List<HighlightEntry<T>> phrases;

    public HighlightPagedResources(Collection<R> content, PageMetadata metadata, List<HighlightEntry<T>> highlightPhrases, Link... links) {
        super(content, metadata, links);
        this.phrases = highlightPhrases;
    }

    @JsonProperty("highlighting")
    public List<HighlightEntry<T>> getHighlightedPhrases() {
        return phrases;
    }
}

和HighlightPagedResourcesAssembler:

public class HighlightPagedResourcesAssembler<T> extends PagedResourcesAssembler<T> {

    public HighlightPagedResourcesAssembler(HateoasPageableHandlerMethodArgumentResolver resolver, UriComponents baseUri) {
        super(resolver, baseUri);
    }


    public <R extends ResourceSupport> HighlightPagedResources<R,T> toResource(HighlightPage<T> page, ResourceAssembler<T, R> assembler) {
        final PagedResources<R> rs = super.toResource(page, assembler);
        final Link[] links = new Link[rs.getLinks().size()];
        return new HighlightPagedResources<R, T>(rs.getContent(), rs.getMetadata(), page.getHighlighted(), rs.getLinks().toArray(links));
    }
}

我必须添加到我的SpringRepositoryRestMvcConfiguration.java:

@Primary
@Bean
public HighlightPagedResourcesAssembler solrPagedResourcesAssembler() {
    return new HighlightPagedResourcesAssembler<Object>(pageableResolver(), null);
}

在cotroller中,我不得不将PagedResourcesAssembler更改为新实现的一个,并在请求方法中使用新的HighlightPagedResources:

@Autowired
private HighlightPagedResourcesAssembler<Object> highlightPagedResourcesAssembler;

@RequestMapping(value = "/conversations/search", method = POST)

public HighlightPagedResources<PersistentEntityResource, Object> findAll(
        @RequestBody ConversationSearch search,
        @SortDefault(sort = FIELD_LATEST_SEGMENT_START_DATE_TIME, direction = DESC) Pageable pageable,
        PersistentEntityResourceAssembler assembler) {

    HighlightPage page = conversationRepository.findByConversationSearch(search, pageable);
    return highlightPagedResourcesAssembler.toResource(page, assembler);
}

结果:

  {
  "_embedded": {
    "conversations": [
    ..our stuff..
    ]
  },
  "_links": {
    ...as you know them...
  },
  "page": {
    "size": 1,
    "totalElements": 25,
    "totalPages": 25,
    "number": 0
  },
  "highlighting": [
    {
      "entity": {
        "conversationId": "a2127d01-747e-4312-b230-01c63dacac5a",
        ...
      },
      "highlights": [
        {
          "field": {
            "name": "textBody"
          },
          "snipplets": [
            "Additional XXX License for YYY Servers DCL-2016-PO0422 \n   \n<em>hi</em> bodgan  \n    \nwe urgently need the",
            "Additional XXX License for YYY Servers DCL-2016-PO0422\n \n<em>hi</em> bodgan\n \nwe urgently need the permanent"
          ]
        }
      ]
    }
  ]
}
 类似资料:
  • 我有一个flask web应用程序,它使用render_template如下所示。我需要在响应中添加一个Content-Security-Policy作为额外的http响应头。我试着按照方法走,但都失败了,给了我500。 1. 在终端上,当我以localhost身份访问web应用程序时,会看到以下内容:3001 127.0.0.1--[06/APR/2015 01:45:01]“GET/HTTP/

  • 我目前拥有的代码是:

  • 我的一个项目搞得一团糟。我必须创建一个对象数组。我制作了一个数组,但它只有一个字段“myMonths”,表示项目的时间长度。在我的主要方法中: 在我的课堂上,单独归档: 我应该再加两个字段,两个字符串。有没有一种方法可以将更多字段/属性添加到此数组中,并在1个索引下同时查看它们?例如,在[0]projectName、projectManager、myMonths ie(字符串、字符串、整数)。任何

  • 问题内容: 我想实现以下目标: 但是我得到的是: 关于如何实现这一目标的任何线索?如何在Python 2和3中做到这一点? 问题答案: 我会这样做,因此更改它的类型将不需要也将其更改。 更新1 这是保留原始回溯的略微修改: 更新2 对于Python 3.x,我的第一次更新中的代码在语法上是不正确的,并且在2012年5月16日对PEP 352的更改中撤消了 启用属性的想法(我的第一次更新发布于201

  • 我需要在每个响应中添加标题。我正打算在下面做 我想在之后这样做,以便一旦控制器处理它,我只是在返回客户端之前添加标头。是正确的吗? 但如何编写响应过滤器? 在已返回,对响应执行任何操作都为时已晚。此时,整个响应已经发送到客户端,您的代码无法访问它。 我觉得上面的说法不对。我不能在过滤链之后添加标题。doFilter(请求、响应)?如果不是,为什么? 我使用的是spring mvc。

  • 我是编码的新手。我想在我当前的代码中添加更多的变量。现在,如果你输入“dog”,它就会打开YouTube。例如,你如何添加另一个变量,这样,如果你输入dog,它仍然会打开youtube,但如果你输入“cat”,它会打开Netflix?你是怎么做到的?感谢所有帮助你的人。请记住,我仍然是一个新的编码,所以请不要批评。