2016-12-02 2 views
1

다음 REST 컨트롤러가 있습니다.스프링 부트 데이터 레스트의 HATEOAS 응답에 더 많은 정보 추가

@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을 수정할 필요가 있다고 가정하고 있지만 적절한 방법은 확신 할 수 없습니다.

편집 :

모델 :

검색과 SolrRepository가 호출
@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 
    ... 
} 

(예를 들어, 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

뭔가가 보이기 때문에 cotroller에서

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

나는 새로 구현 하나 PagedResourcesAssembler을 변경하고도 요청 방식에 새로운 HighlightPagedResources을 사용했다 'content'와'highlighted '사이에 다르면'Books' 소스 코드를 보여줘야합니다. 실제 결과 및 예상/결과의 실제 스 니펫이 도움이 될 수 있습니다. –

+0

변수 및 필드 이름을 소문자로 지정하십시오. 대문자는 Java 개발자에게 클래스 이름처럼 보입니다. –

+0

Books 엔터티 클래스를 게시하는 경우 도움이 될 것입니다. –

답변

1

나는 응답 페이지를 작성하는 대신 HighlightPagePage<Books>을 사용하고 있었다. 페이지에는 분명히 강조 표시된 부분이 잘 리게되는 content이 포함되어 있지 않습니다. 하이라이트 페이지에 기반을 둔 새로운 페이지를 만들어 페이지 대신 결과로 리턴했다.

@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

, 내가 그것을 어떻게 있습니다 :

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에 추가했다 : 나는 나의

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

을 HighlightPagedResources 및 HighlightPagedResourcesAssembler 썼다.자바 :

@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" 
      ] 
     } 
     ] 
    } 
    ] 
}