@Entity
@Table(name = "users")
public class Register {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Email
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
如果 的值getEmail()不是電子郵件地址,我會收到以下錯誤:
錯誤 17124 --- [nio-8080-exec-5] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于路徑 [] 背景關系中的 servlet [dispatcherServlet] 引發例外 [請求處理失敗;嵌套例外是 org.springframework.transaction.TransactionSystemException:無法提交 JPA 事務;嵌套例外是 javax.persistence.RollbackException: Error while committing the transaction] 根本原因
javax.validation.ConstraintViolationException:組 [javax.validation.groups.Default,] 約束沖突串列:[ ConstraintViolationImpl {interpolatedMessage ='必須是格式正確的電子郵件地址',propertyPath =email,rootBeanClass=類 com.dynamicquatation.dq.components.register.Register,messageTemplate='{javax.validation.constraints.Email.message}'}
如何驗證該欄位?我試過了,if (data.getEmail() != null) {...}但我仍然得到同樣的錯誤。
這是我嘗試捕獲錯誤的另一種方式:
@RestController
@CrossOrigin(origins = "http://localhost:4200")
public class RegisterController {
private final RegisterService registerService;
public RegisterController(RegisterService registerService) {
this.registerService = registerService;
}
@PutMapping(value = "register")
Map<String, Object> register(@RequestBody Register data, MethodArgumentNotValidException exception) {
return registerService.registerUser(data, exception);
}
}
@Service
public class RegisterService {
public Map<String, Object> registerUser(Register data, MethodArgumentNotValidException exception) {
Map<String, Object> response = new HashMap<>();
Map<String, String> errors = new HashMap<>();
// Validate email
System.out.println(exception.getFieldError("email"));
它給了我這個錯誤:
控制器 [com.dynamicquatation.dq.components.register.RegisterController]
方法 [java.util.Map<java.lang.String, java.lang.Object> com.dynamicquatation.dq.components.register.RegisterController.register(com.dynamicquatation.dq.components.register.Register,org.springframework. web.bind.MethodArgumentNotValidException)] 與引數值:
[0] [型別=com.dynamicquatation.dq.components.register.Register] [值=com.dynamicquatation.dq.components.register.Register@3f303f1a],
[1] [type=org.springframework.validation.BeanPropertyBindingResult] [value=org.springframework.validation.BeanPropertyBindingResult: 0 個錯誤] ] 根本原因
java.lang.IllegalArgumentException:引數型別不匹配
uj5u.com熱心網友回復:
我同意 Alex 使用@RequestBody @Valid Register data. 但是,如果您還想顯示錯誤訊息,則需要使用MethodArgumentNotValidException. 您可以在帶有@ControllerAdvice注釋的類中使用它,而不是在控制器或服務中使用它。
@ControllerAdvice
public class ValidationHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
Map<String, Object> response = new HashMap<>();
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
errors.put(((FieldError) error).getField(), error.getDefaultMessage());
response.put("errors", errors);
});
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}
}
那應該回應:
{
"errors": {
"email": "must be a well-formed email address"
}
}
如果您想要自定義錯誤訊息,可以使用
@Email(message = "Email is not valid")
uj5u.com熱心網友回復:
收到尸體時,你必須召喚@Valid它
@RequestBody @Valid Register data
盡管在您的示例中,它位于物體類上,從功能 POV 可以作業,但如果專案變得更復雜,這不是您想要的模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/514382.html
標籤:爪哇弹簧靴
