2016-12-02 2 views
1

Ich habe den folgenden REST-Controller.Weitere Informationen zu der HATEOAS-Antwort in Spring Boot Data Rest hinzufügen

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

    } 

Mein Page<Books> BooksResult = BooksService.findBookText(query, pageable); durch SolrCrudRepository gesichert. Wenn es ausgeführt wird, hat BookResult mehrere Felder darin, das Inhaltsfeld und mehrere andere Felder, eins ist highlighted. Leider ist das einzige, was ich von der REST-Antwort zurückbekomme, die Daten im Feld content und die Metadateninformationen in der HATEOAS-Antwort (z. B. Seiteninformationen, Links usw.). Was wäre der richtige Weg, das Feld highlighted zur Antwort hinzuzufügen? Ich gehe davon aus, dass ich die ResponseEntity ändern müsste, aber unsicher über den richtigen Weg.

bearbeiten:

Modell:

@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 
    ... 
} 

Wenn eine Suche und die SolrRepository genannt wird (zum Beispiel BooksService.findBookText (Abfrage, seitenwechselbar);) Ich erhalte diese Objekte zurück.

enter image description here

Doch meiner REST Antwort sehe ich nur den "Inhalt". Ich möchte in der Lage sein, das "markierte" Objekt der REST-Antwort hinzuzufügen. Es scheint nur, dass HATEOAS nur die Informationen im "content" -Objekt sendet (siehe unten für das Objekt).

{ 
    "_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 
    } 
} 

Nur damit Sie sich ein vollständiges Bild machen können, ist dies das Repository, das den BooksService unterstützt. Der gesamte Dienst ruft diese SolrCrudRepository-Methode auf.

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

Da scheint etwas zu Wenn Sie zwischen "Inhalt" und "Hervorgehoben" unterscheiden, sollten Sie uns den Quellcode für "Bücher" zeigen. Ein tatsächlicher Ausschnitt des tatsächlichen Ergebnisses und das Ergebnis, das Sie erwarten/wollen, könnten helfen. –

+0

Bitte machen Sie Variablen- und Feldnamen in Kleinbuchstaben. Großbuchstaben sehen für Java-Entwickler wie Klassennamen aus. –

+0

Wäre hilfreich, wenn Sie Ihre Buchungskörper-Klasse veröffentlichen. –

Antwort

1

war ich mit Page<Books> statt HighlightPage die Antwort-Seite zu erstellen. Seite enthält offensichtlich nicht content, die den markierten Teil verursacht wurde abgeschnitten. Ich habe am Ende eine neue Seite erstellt, die auf HighlightPage basiert, und diese als Ergebnis anstelle von Page zurückgegeben.

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

Wahrscheinlich ein besserer Weg, dies zu tun, aber ich kann nichts finden, die das tun würde, was ich es ohne eine Änderung eine Tonne Code tun wollte. Hoffe das hilft!

+0

Danke, aber das ist wahrscheinlich nicht geeignet für uns. Vielen Dank! – Cipous

+0

Kein Problem! Wäre neugierig, wie Sie das Problem lösen. Viel Glück. –

+0

Ich habe meine Lösung hinzugefügt, vielleicht wird es dir helfen. – Cipous

3

Ok, hier ist, wie ich es tat: Ich schrieb mein 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; 
    } 
} 

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

Ich musste meine Feder RepositoryRestMvcConfiguration hinzuzufügen.java:

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

In cotroller hatte ich PagedResourcesAssembler für neu implementierte ein und auch neue HighlightPagedResources in Request-Methode verwenden, um zu ändern:

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

ERGEBNIS:

{ 
    "_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" 
      ] 
     } 
     ] 
    } 
    ] 
} 
Verwandte Themen