如何在 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。
以上仍然成立,是对原问题的回答。
解决新编辑的问题:
- 将
@RequestBody BookDto newBook
参数更改为字符串参数
(例如,@RequestBody String newBookJson
)。
- 执行转换前验证(例如,"is the body an empty JSON string value")。
- 如果正文包含有效的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 请求的主体是否为空(例如仅包含 {})。
我想 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。
以上仍然成立,是对原问题的回答。
解决新编辑的问题:
- 将
@RequestBody BookDto newBook
参数更改为字符串参数 (例如,@RequestBody String newBookJson
)。 - 执行转换前验证(例如,"is the body an empty JSON string value")。
- 如果正文包含有效的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 请求的主体是否为空(例如仅包含 {})。