2016-12-02 3 views
1

У меня есть следующий контроллер REST.Добавление дополнительной информации в ответ HATEOAS в Spring Boot Data 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); 

    } 

Мои Page<Books> BooksResult = BooksService.findBookText(query, pageable); подкреплена SolrCrudRepository. Когда он запущен BookResult имеет несколько полей в нем, поле содержимого и несколько других полей, один из которых - highlighted. К сожалению, единственное, что я получаю от ответа REST, это данные в поле content и данные метаданных в ответе HATEOAS (например, информация о странице, ссылки и т. Д.). Каким будет правильный способ добавления поля highlighted в ответ? Я предполагаю, что мне нужно будет изменить ResponseEntity, но не уверены в правильном пути.

Edit:

Модель:

@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 (запрос, выгружаемой);) Я вернусь к этим объектам.

enter image description here

Однако, в моем ответе 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); 

} 
+1

Так что-то, кажется, быть разными между 'content' и' highlight', вы должны показать нам исходный код для 'Books'. Фактический фрагмент фактического результата и результат, который вы ожидаете/хотите, могут помочь. –

+0

Пожалуйста, введите имена переменных и полей в нижнем регистре. Имена верхнего регистра выглядят как имена классов для разработчиков Java. –

+0

Помогло бы, если бы вы опубликовали свой класс сущностей Books. –

ответ

1

Я использовал Page<Books> вместо HighlightPage создать страницу отклика. Страница, очевидно, не содержит content, которая вызывала усечение выделенной части. Я закончил создание новой страницы, основанной на HighlightPage, и вернул это как мой результат вместо страницы.

@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); 
    } 

Вероятно, лучший способ сделать это, но я не мог найти ничего, что бы делать то, что я хотел, чтобы это сделать, не имея на изменение тонны кода. Надеюсь это поможет!

+0

Спасибо, но это то, что, вероятно, не подходит для нас. Благодаря! – Cipous

+0

Нет проблем! Было бы любопытно, как вы решаете проблему. Удачи. –

+0

Я добавил свое решение, возможно, это поможет вам. – Cipous

3

Хорошо, вот как я это сделал: Я написал мое 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)); 
    } 
} 

мне пришлось добавить к моей весенней RepositoryRestMvcConfiguration.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" 
      ] 
     } 
     ] 
    } 
    ] 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^