【问题标题】:How can I pass an object as a query param in URI line?如何在 URI 行中将对象作为查询参数传递?
【发布时间】:2018-05-19 20:14:05
【问题描述】:

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

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

在这种情况下使用作者或@RequestParam 代替请求正文是否是一种好方法? 我考虑过只请求作为作者姓名的字符串,但这会影响服务的方法。

【问题讨论】:

  • 您不能使用作者 ID 代替完整作者吗?

标签: java spring spring-mvc model-view-controller


【解决方案1】:

根据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,但传递对象(让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&...
    

另见:

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 2017-08-01
    • 1970-01-01
    • 2019-10-19
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多