代码之家  ›  专栏  ›  技术社区  ›  Pasha

如何在URI行中将对象作为查询参数传递?

  •  0
  • Pasha  · 技术社区  · 7 年前

    你能帮我解释一下我应该如何传递作者值吗?

    @GetMapping(value = "/search")
        public ResponseEntity<List<Book>> searchBooksByTitleAndAuthor(
                @RequestParam(value = "title", required = false) final String title,
                @RequestParam(value = "author", required = false) final Author author) {
            HttpStatus httpStatus = HttpStatus.OK;
            List<Book> books = null;
            if (title == null && author == null) {
                log.info("Empty request");
                httpStatus = HttpStatus.BAD_REQUEST;
            } else if (title == null || author == null) {
                books = bookService.getBooksByTitleOrAuthor(title, author);
            } else {
                Optional<Book> book = bookService.getBookByTitleAndAuthor(title, author);
                if (book.isPresent()) {
                    books = Arrays.asList(book.get());
                }
            }
            if (books == null) {
                return new ResponseEntity<>(httpStatus);
            } else {
                return new ResponseEntity<>(books, httpStatus);
            }
        }
    

    Author 类,看起来像:

    @Entity
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @EqualsAndHashCode
    @ToString
    public final class Author {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long id;
    
        private String name;
    
        private LocalDate dateOfBirth;
    
        private String bio;
    }
    

    在这种情况下,使用author或@RequestParam而不是request body是一种好方法吗? 我考虑过只请求作为作者姓名的字符串,但这会影响服务的方法。

    1 回复  |  直到 7 年前
        1
  •  2
  •   xerx593    7 年前

    根据 https://lankydanblog.com/2017/03/11/passing-data-transfer-objects-with-get-in-spring-boot/ , ... 您可以(在您的计算机上设置一些转换注释之后) author.dateOfBirth ):

    1. 使用 @RequestParam 在字符串参数上(并让您的控制器/某人 进行转换):

          ..., @RequestParam(value = "author", required = false) final String author) { 
      
           ...final Author author = new ObjectMapper().setDateFormat(simpleDateFormat)
                                   .readValue(author, Author.class);
      

      在这种情况下,您会要求:

      http://localhost:8080/myApp/search?title=foo&author={"id"="1",...}
      
    2. 或者:省略 @请求参数 ,但传递对象(并让spring负责转换):

      ...(@RequestParam(value = "title", required = false) final String title,
           final Author author)
      

      并提出如下要求:

      http://localhost:8080/myApp/search?title=foo&id=1&name=Donald E. Knuth&...
      

    另见: