2015-09-25 16 views
5

Nel nostro Spring-Data-Rest Project abbiamo una ricerca personalizzata (fuzzy) su/buergers/search/findBuergerFuzzy? SearchString = "..." endpoint.Spring Data Rest - Aggiungi collegamento all'endpoint di ricerca

È possibile aggiungere un collegamento per l'endpoint/buergers/search (senza sovrascrivere i metodi findBy del repository esposti automaticamente)?

Il controller di esporre la ricerca:

@BasePathAwareController 
@RequestMapping("/buergers/search/") 
public class BuergerSearchController { 

    @Autowired 
    QueryService service; 

    @RequestMapping(value = "/findBuergerFuzzy", method = RequestMethod.GET) 
    public 
    @ResponseBody 
    ResponseEntity<?> findBuergerFuzzy(PersistentEntityResourceAssembler assembler, @Param("searchString") String searchString) { 
     if (searchString.length() < 3) 
      throw new IllegalArgumentException("Search String must be at least 3 chars long."); 
     List<Buerger> list = service.query(searchString, Buerger.class, new String[]{"vorname", "nachname", "geburtsdatum", "augenfarbe"}); 
     final List<PersistentEntityResource> collect = list.stream().map(assembler::toResource).collect(Collectors.toList()); 
     return new ResponseEntity<Object>(new Resources<>(collect), HttpStatus.OK); 
    } 
} 

risposta

3

Scavando la fonte primavera-dati-resto ho trovato il RepositorySearchesResource che sembra risolvere il problema.

@Component 
public class SearchResourcesProcessor implements ResourceProcessor<RepositorySearchesResource> { 

    @Override 
    public RepositorySearchesResource process(RepositorySearchesResource repositorySearchesResource) { 
     final String search = repositorySearchesResource.getId().getHref(); 
     final Link findFullTextFuzzy = new Link(search + "/findFullTextFuzzy{?q}").withRel("findFullTextFuzzy"); 
     repositorySearchesResource.add(findFullTextFuzzy); 

     return repositorySearchesResource; 
    } 
} 

Poiché questo codice viene generato da modelli, questo è sufficiente e soddisfa pienamente le nostre esigenze. Assicurati di controllare i commenti per il modo giusto e sicuro.

+2

Controllare 'resource.getDomainType() 'per assicurarsi che la funzione di ricerca venga visualizzata solo alla risorsa giusta. \t 'if (ResourceClass.class.equals (resource.getDomainType()))' –

+2

La tua soluzione è abbastanza pericolosa, perché stai perdendo la coerenza tra la mappatura del tuo metodo (dove è servito) e il suo collegamento (dove segue la relazione porterà). Dovresti usare i metodi statici 'linkTo' e' methodOn' di Spring Hateoas per evitare che durante la creazione di 'Link' –