如何在 Spring Boot 中检测请求正文中的 JSON 对象是否为空?

How can I detect if the JSON object within Request body is empty in Spring Boot?

我想 return 当 REST 请求的主体为空(例如仅包含 {})时出错,但无法检测请求主体是否包含空 JSON与否。

我尝试更改 @RequestBody(required = true) 但它不起作用。

@PatchMapping("{id}")
public ResponseEntity<Book> updateAdvisor(@PathVariable("id") Integer id, 
   @Valid @RequestBody  BookDto newBook) {
    Book addedBook = bookService.updateBook(newBook);
    return new ResponseEntity<>(addedBook,HttpStatus.OK);
  }

如果发送的正文包含一个空 JSON 我应该 return 一个例外。 如果正文不为空并且至少提供了一个元素,我不会 return 出错。

尝试@RequestBody(required = false)

这应该会导致 newBook 参数在没有请求主体时为 null。

以上仍然成立,是对原问题的回答。

解决新编辑的问题:

  1. @RequestBody BookDto newBook参数更改为字符串参数 (例如,@RequestBody String newBookJson)。
  2. 执行转换前验证(例如,"is the body an empty JSON string value")。
  3. 如果正文包含有效的JSON, 将 JSON 解析为一个对象(下面的示例)。
@Autowired
private ObjectMapper objectMapper; // A Jackson ObjectMapper.

@PatchMapping("{id}")
public ResponseEntity<Book> updateAdvisor(
  @PathVariable("id") Integer id, 
  @Valid @RequestBody String newBookJson)
{
  if (isGoodStuff(newBookJson)) // You must write this method.
  {
    final BookDto newBook = ObjectMapper.readValue(newBookJson, BookDto.class);

    ... do stuff.
  }
  else // newBookJson is not good
  {
    .. do error handling stuff.
  }
}

假设您有一个 Class BookDto :

 public class BookDto {
       private String bookName;
       private String authorName;
  }

我们可以在Class BookDto:

上使用@ScriptAssert注解
@ScriptAssert(lang = "javascript", script = "_this.bookName != null || _this.authorName != null")
public class BookDto {
       private String bookName;
       private String authorName;
  }

然后在 resource/controller Class:

@PatchMapping("{id}")
public ResponseEntity<Book> updateAdvisor(@PathVariable("id") Integer id, 
   @Valid @RequestBody  BookDto newBook) {
    Book addedBook = bookService.updateBook(newBook);
    return new ResponseEntity<>(addedBook,HttpStatus.OK);
  }

现在@Valid 注释将验证我们在@ScriptAssert 注释的脚本属性中声明的任何内容。即它现在检查 REST 请求的主体是否为空(例如仅包含 {})。