2011-08-27 26 views
6

Tôi đang sử dụng Spring và Hibernate trong ứng dụng của mình, Có một kịch bản mà tôi chèn cùng một bản ghi morethan một lần, Vì vậy, ứng dụng ném đúng hạn chế ngoại lệ vì tôi đã áp dụng ràng buộc duy nhất trong một cột db. xa là tất cả mọi thứ tốt đẹp.Thông điệp ngoại lệ tùy chỉnh với khung công tác Spring

Nhưng tôi phải hiển thị một số thông báo tùy chỉnh như "bản ghi đã tồn tại" thay vì hiển thị Ngoại lệ Hibernate.

Tôi có thể làm gì với khung công tác Spring.

Bất kỳ gợi ý hoặc ví dụ nào được đánh giá cao.

Kính trọng,

Raju

Trả lời

6

có bạn có thể ngoại lệ trong điều khiển:

@ExceptionHandler(Exception.class) 
     public ModelAndView handleMyException(Exception exception) { 
     ModelAndView mv = new ModelAndView("error"); 
     mv.addObject("message"."record already exists"); 
     return mv; 
       } 

Vì lý do bạn có thể bắt được bất kỳ trường hợp ngoại lệ nào, chỉ cần chèn nó vào tham số @ExceptionHandler

Hy vọng điều đó sẽ hữu ích.

+0

+1 và cảm ơn !! – Gabber

0

bạn có thể bắt các ngoại lệ ném vào mùa xuân/hibernate và ném một trong những trường hợp ngoại lệ của riêng bạn mà sẽ giữ 'kỷ lục đã tồn tại' tin nhắn, bạn có thể thậm chí nhìn lên một cục thông điệp từ một bó tài nguyên và hiển thị thông báo này trên lớp trình bày của bạn (ví dụ jsp)

+0

Ngay cả khi tôi đang suy nghĩ tương tự bằng cách mở rộng ngoại lệ, tôi sẽ tạo một ngoại lệ. Nhưng làm cách nào tôi có thể hiển thị cùng một thông báo trong lớp cài đặt sẵn của Spring. – Raj

+0

khi người dùng cố gắng thêm bản ghi trùng lặp, bạn có thể bắt ngoại lệ từ chế độ ngủ đông, sau đó trong lớp dịch vụ của bạn (tức là nơi bạn gọi logic phụ trợ), bạn sẽ cố gắng chèn bản ghi và bắt ngoại lệ. , một cái gì đó như thế – eon

2

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.

Các vấn đề liên quan