Как я могу передать объект в качестве параметра запроса в строке URI? - PullRequest
0 голосов
/ 19 мая 2018

Не могли бы вы помочь мне и объяснить, как я должен передать значение автора?

@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 вместо тела запроса в этой ситуации?Я думал о том, чтобы запросить только строку, которая является именем автора, но это повлияет на методы службы.

1 Ответ

0 голосов
/ 20 мая 2018

Согласно 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. альтернативно: пропустить @RequestParam, но передайте объект (и пусть пружина позаботится о преобразовании):

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

    и запросите:

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

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...