2017-02-07 39 views
6

Như tiêu đề nói.Làm cách nào để lọc dữ liệu theo cách an toàn bằng Spring?

tôi về cơ bản rất thích làm các yêu cầu như

/api/todos/?completed=eq.true&created_at=lt.1486462109399 

Có sẵn sàng spring way đạt được như vậy? Một cái gì đó giống như cơ chế Page/Pageable sẽ là tuyệt vời.

Nếu không có, tôi nghĩ rằng tôi có thể triển khai nó bằng cách sử dụng Truy vấn tiêu chí Hibernate & Đối tượng giải quyết lại. Về cơ bản cho phép tôi viết các bộ điều khiển của mình như

@GetMapping 
public ResponseEntity<Page<TodoDTO>> listAll(Criteria criteria, Pageable pageable) 
{ 
     Page<Todo> todos = todoService.listAll(criteria, pageable) 
     ... 
} 

Một người quyết định đối số tùy chỉnh sẽ chịu trách nhiệm chuyển chuỗi truy vấn thành Tiêu chí. Không hoàn toàn chắc chắn như thế nào tôi sẽ xử lý nó trong dịch vụ nhưng đó là hướng mà tôi sẽ cố gắng thực hiện điều này.

Đó có phải là cách tiếp cận tốt không? Bất kỳ đề xuất? (Tất cả giả sử không có cơ chế sẵn sàng cho việc đó).

Trợ giúp của bạn được đánh giá cao.

+0

Thời gian qua tôi đã cùng một vấn đề tôi không thể tìm thấy một mùa xuân chỉ có giải pháp. Tuy nhiên bạn có thể kiểm tra cách đạt được điều này bằng cách sử dụng Fiql/rsql với Đây là một [blog] tốt (http://www.baeldung.com/rest-api-search-language-rsql-fiql) trên đó. – gkatzioura

+0

Đã một năm kể từ khi bạn hỏi câu hỏi này và tôi không biết bạn đang ở đâu nhưng điều này sẽ trả lời vấn đề của bạn: http://www.baeldung.com/rest-api-search-language-spring-data- thông số kỹ thuật Bạn cũng có thể kiểm tra câu hỏi này: https://stackoverflow.com/questions/20280708/filtering-database-rows-with-spring-data-jpa-and-spring-mvc – leventunver

Trả lời

1

Một tùy chọn khác để xây dựng một API truy vấn thông thạo là sử dụng một phân tích cú pháp RSQL. RSQL là ngôn ngữ truy vấn để lọc các mục nhập được tham số trong RESTful APIs. Làm theo this article và API của bạn sẽ có thể xử lý các URL như: điều khiển

http://localhost:8080/users?search=firstName==jo*;age<25 

mẫu:

@RestController 
@RequestMapping(value = "/users") 
public class UserController { 

    @Autowired 
    private UserRepository repo; 

    @GetMapping 
    public List<User> findAllByRsql(@RequestParam(value = "search") String search) { 
     Node rootNode = new RSQLParser().parse(search); 
     Specification<User> spec = rootNode.accept(new CustomRsqlVisitor<User>()); 
     return repo.findAll(spec); 
    } 

} 
0

Bạn có thể tạo Search/Filter REST API using Spring Data JPA and Specifications. Dưới đây là một ví dụ URL kiểm tra rằng API kết quả sẽ có thể xử lý:

http://localhost:8080/users?search=lastName:doe,age>25 

và gương điều khiển:

@RestController 
@RequestMapping(value = "/users") 
public class UserController { 

    @Autowired 
    private UserRepository repo; 

    @GetMapping 
    public List<User> search(@RequestParam(value = "search") String search) { 
     UserSpecificationsBuilder builder = new UserSpecificationsBuilder(); 
     Pattern pattern = Pattern.compile("(\w+?)(:|<|>)(\w+?),"); 
     Matcher matcher = pattern.matcher(search + ","); 
     while (matcher.find()) { 
      builder.with(matcher.group(1), matcher.group(2), matcher.group(3)); 
     } 

     Specification<User> spec = builder.build(); 
     return repo.findAll(spec); 
    } 
} 
Các vấn đề liên quan