Tôi đang đối mặt với cùng một vấn đề nhưng trong trường hợp của tôi, một hoặc nhiều trường có thể được nhân đôi (tên người dùng hoặc email). Do đó, org.hibernate.exception.ConstraintViolationException
không đủ cụ thể để nói liệu tên người dùng hoặc email có khiến cho ngoại lệ này bị ném và thông báo nào hiển thị trong hậu quả hay không.
Tôi chỉ xem danny.lesnik's answer nhưng không tuyệt vời vì nó chỉ chuyển hướng đến trang "chuyên dụng". Giả sử bạn chỉ cần chuyển hướng đến người dùng trang đã bật sẽ tránh việc tạo trang mới mà bạn muốn nói. Tuy nhiên tôi giả sử bạn đã có một Spring validator làm một số công việc xác nhận biểu mẫu. Đó là lý do tại sao trong trường hợp của tôi, tôi quyết định chỉ cần thực hiện kiểm tra trùng lặp các trường (tên người dùng và email) của mình trong cùng một vị trí (trong Trình xác thực). Có vẻ như phù hợp hơn, nhất quán (với phần còn lại của xác nhận) và giải pháp sạch hơn.
Dưới đây là một số mã để minh họa:
điều khiển của tôi
@Controller
public class WebController {
@Autowired
private UserServiceImpl userService;
@Autowired
private CustomUserDetailsValidator customUserDetailsValidator;
...
@RequestMapping(value = "/login/create-account", method = RequestMethod.POST)
public String createAccount(@ModelAttribute("user") CustomUserDetails user, BindingResult result, Model model, SessionStatus status) {
customUserDetailsValidator.validate(user, result);
if(result.hasErrors()){
model.addAttribute("user", user);
// Print the errors to the console - FIXME: log error instead
System.out.println("Validation errors:");
for (FieldError error : result.getFieldErrors()) {
System.out.println(error.getField() + " - " + error.getDefaultMessage());
}
return "login/create-account";
}
else{
userService.registerUser(user);
return "redirect:/login/create-account-success";
}
}
...
}
Validator My
public class CustomUserDetailsValidator implements Validator {
@Autowired
private UserServiceImpl userService;
...
@Override
public void validate(Object target, Errors errors) {
// some simple validations
// and here some complex validation (is username or email used duplicated?)
if(errors.getAllErrors().size() == 0){
if (userService.doesUsernameAlreadyExist(user.getUsername()))
errors.rejectValue(usernameFieldName, "duplicate.username","username already exists");
if (userService.doesEmailAlreadyExist(user.getEmail()))
errors.rejectValue(emailFieldName, "duplicate.email","email already exists");
}
}
}
tôi không chắc chắn nếu đó là cách tốt nhất để làm điều này, nhưng nghĩ giải pháp của tôi sẽ cho phép mở rộng thêm (bạn có thể thêm các kiểm tra khác nhau về bất kỳ ràng buộc nào khác).
Hy vọng nó sẽ giúp người khác và nó cũng sẽ là thú vị để có được suy nghĩ của nhiều dev hơn về giải pháp này.
Nguồn
2012-11-19 14:44:48
+1 và cảm ơn !! – Gabber