2015-09-25 26 views
5

W naszym Spring-Data-Rest Project mamy niestandardowe (rozmyte) wyszukiwanie na punkcie końcowym/buergers/search/findBuergerFuzzy? SearchString = "...".Spring Data Rest - Dodaj link do wyszukiwania w punkcie końcowym

Czy można dodać łącze do niego w punkcie końcowym/buergers/search (bez przesłonięcia automatycznie wyeksponowanych metod FindBy repozytorium)?

Kontroler wystawiając wyszukiwania:

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

Odpowiedz

3

Kopanie źródło wiosna-data-reszta znalazłem RepositorySearchesResource który wydaje się rozwiązać problem.

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

Ponieważ generujemy ten kod za pomocą szablonów, jest to wystarczające i spełnia nasze wymagania. Upewnij się, że komentarze są sprawdzane w odpowiedni i bezpieczny sposób.

+2

Należy sprawdzić 'resource.getDomainType()', aby upewnić się, że funkcja wyszukiwania wyświetla się tylko we właściwym zasobie. \t 'if (ResourceClass.class.equals (resource.getDomainType()))' –

+2

Twoje rozwiązanie jest dość niebezpieczne, ponieważ tracisz spójność między mapowaniem swojej metody (gdzie jest ona obsługiwana) a jej łączeniem (gdzie relacja będzie prowadzić). Powinieneś używać metod statycznych 'linkTo' i' methodOn' ze Spring Hateoas, aby tego uniknąć podczas tworzenia 'Link' –