2015-09-25 22 views
5

Trong dự án Spring-Data-Rest của chúng tôi, chúng tôi có một tìm kiếm tùy chỉnh (mờ) trên điểm cuối/buergers/search/findBuergerFuzzy? SearchString = "...".Nghỉ ngơi dữ liệu mùa xuân - Thêm liên kết để tìm kiếm điểm cuối

Có thể thêm một liên kết cho nó trên/buergers/endpoint (Không ghi đè phương thức findBy Repository tự động tiếp xúc) không?

Controller lộ tìm kiếm:

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

Trả lời

3

Đào nguồn lò xo dữ liệu còn lại tôi thấy RepositorySearchesResource mà dường như để giải quyết vấn đề.

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

Vì chúng tôi tạo mã này theo mẫu, điều này là đầy đủ và đầy đủ nhu cầu của chúng tôi. Đảm bảo kiểm tra các nhận xét cho đúng cách và an toàn.

+2

Bạn nên kiểm tra 'resource.getDomainType()' để đảm bảo chức năng tìm kiếm của bạn chỉ hiển thị ở đúng tài nguyên. \t 'if (ResourceClass.class.equals (resource.getDomainType()))' –

+2

Giải pháp của bạn khá nguy hiểm, bởi vì bạn đang mất tính nhất quán giữa ánh xạ phương thức của bạn (nó được phân phát ở đâu) và liên kết của nó (ở đâu sau đây mối quan hệ sẽ dẫn đầu). Bạn nên sử dụng 'linkTo' và' methodOn' phương thức tĩnh từ Spring Hateoas để tránh điều đó khi tạo 'Link' –

Các vấn đề liên quan