2015-09-25 61 views
5

在我們的Spring-Data-Rest項目中,我們對/ buergers/search/findBuergerFuzzy?searchString =「...」端點進行了自定義(模糊)搜索。Spring Data Rest - 添加鏈接到搜索端點

是否可以在/ buergers/search端點上添加一個鏈接(不覆蓋自動公開的Repository findBy方法)?

的控制器暴露的搜索:

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

回答

3

挖彈簧數據靜止源我發現,這似乎解決問題的RepositorySearchesResource

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

因爲我們通過模板生成此代碼,所以這已足夠滿足我們的需求。請務必以正確且安全的方式檢查評論。

+2

您應該檢查'resource.getDomainType()'以確保您的搜索功能只顯示在正確的資源。 \t'if(ResourceClass.class.equals(resource.getDomainType()))' –

+2

你的解決方案是相當危險的,因爲你的方法映射(它在哪裏服務)和它的鏈接該關係將導致)。你應該使用來自Spring Hateoas的'linkTo'和'methodOn'靜態方法來避免當你創建'Link'時 –