java - 我应该编写自定义验证还是正确配置弹簧?
问题描述
我有一个实体。我使用休息控制器。我的目标是验证即将到来的 JSON 对象中的所有字段。如果我发现一个或多个不正确的字段,我需要返回所有不正确的字段。我怎么能用春天做呢?我应该检查 try-catch 中的每个字段吗?
@Entity
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Size(min = 4, message = "Min length 4")
private String first_name;
@Size(min = 4, message = "Min length 4")
private String last_name;
@Size(min = 4, message = "Min length 4")
private String fathers_name;
}
解决方案
您只需要使用@RequestBody
and @Valid
in rest 方法注释您的客户端。这是一个例子:
@RestController
@RequestMapping("/api/client")
public class ClientController {
@PostMapping
public ResponseEntity createNewClient(@RequestBody @Valid Client client) {
// insert client
return new ResponseEntity(HttpStatus.CREATED);
}
}
如果 JSON 数据无效,方法将抛出MethodArgumentNotValidException
. 你可以这样处理它:
@ControllerAdvice
public class ExceptionHandlerController {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleArgumentNotValidException(
MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
BindingResult bindingResult = ex.getBindingResult();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
errors.put(fieldError.getField(), fieldError.getDefaultMessage());
}
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
}
推荐阅读
- postgresql - 为什么 Postgresql pgadmin 中强调密码?
- azure - Spark Cosmos db 连接器正在删除大多数行为空的列
- tcl - Tcl - 从标准输入读取字符而无需在 Tcl 中按 enter
- api - Stocktwits API 不工作,错误是“此页面不工作”
- amazon-web-services - 如何使用 AWS CLI 仅列出 AWS 组织下的帐号和账户名称
- javascript - 反应没有为相同的 URL 获取不同的图像
- c# - EF Core 6 派生的 DbContext 未从 Startup 获取连接字符串
- python - python从元组列表中删除tup [0]重复项
- visual-studio-code - (vs代码)杀死终端按钮消失了
- java - 为什么在尝试运行 JavaFX 项目时应用程序启动方法出现异常?