2012-08-24 36 views
14

Tôi đang cố gắng thêm thông báo lỗi email riêng vào mô hình của mình theo cách thủ công nhưng không có gì hiển thị trong chế độ xem.
Tôi nghĩ rằng đó có thể là cách tôi tạo hoặc gắn ObjectError với BindingResult.
Tôi đang thêm lỗi trong phần bắt.Thêm thông báo lỗi vào DataBinder Spring 3 cho các trường đối tượng tùy chỉnh

Dưới đây là nội dung của result.errors khi tôi rời khỏi trường email trống rỗng và JSR-303 chú thích kick in (hiển thị lỗi trong quan điểm):

[Field error in object 'user' on field 'email': rejected value []; codes [NotEmpty.user.email,NotEmpty.email,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.email,email]; arguments []; default message [email]]; default message [may not be empty]] 



Dưới đây là nội dung của kết quả. lỗi sau khi tôi tự thêm các ErrorObject (lỗi email không hiển thị trong view):

[Error in object 'email': codes []; arguments []; default message [An account already exists for this email.]] 



Bộ điều khiển:

@RequestMapping(value = "/registration", method = RequestMethod.POST) 
    public ModelAndView post(@Valid User user, BindingResult result) 
    { 

     if (result.hasErrors()) 
     { 
      ModelAndView modelAndView = new ModelAndView(
        Consts.MODEL_RESISTER_PAGE); 
      modelAndView.addObject("user", user); 
      return modelAndView; 
     } 
     else 
     { 
      try 
      { 
       userService.addUser(user); 

       ModelAndView modelAndView = new ModelAndView(
         Consts.MODEL_CARD_REPORTS_HOME_PAGE); 
       modelAndView.addObject("userRegisteredSuccess", Boolean.TRUE); 

       return modelAndView; 
      } 
      catch (DataIntegrityViolationException ex) 
      { 
       ObjectError error = new ObjectError("email","An account already exists for this email."); 

       result.addError(error); 

       ModelAndView modelAndView = new ModelAndView(
         Consts.MODEL_RESISTER_PAGE); 

       modelAndView.addAllObjects(result.getModel()); 
       modelAndView.addObject("user", user); 

       return modelAndView; 
      } 
     } 
    } 

mẫu của tôi:

@Entity 
public class User implements Serializable 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = -5232533507244034448L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotEmpty 
    @Size(min=2, max=15) 
    private String firstname; 

    @NotEmpty 
    @Size(min=2, max=15) 
    private String surname; 

    @NotEmpty 
    @Email 
    private String email; 

    @NotEmpty 
    @Size(min=6, max=10) 
    private String password; 

    public Long getId() 
    { 
     return id; 
    } 

    public void setId(Long id) 
    { 
     this.id = id; 
    } 

    public String getFirstname() 
    { 
     return firstname; 
    } 

    public void setFirstname(String firstname) 
    { 
     this.firstname = firstname; 
    } 

    public String getSurname() 
    { 
     return surname; 
    } 

    public void setSurname(String surname) 
    { 
     this.surname = surname; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public void setEmail(String email) 
    { 
     this.email = email; 
    } 

    public String getPassword() 
    { 
     return password; 
    } 

    public void setPassword(String password) 
    { 
     this.password = password; 
    } 
} 



add.html

<form id="registrationForm" action="#" 
     th:action="@{/registration}" th:object="${user}" method="post" 
     class="clearfix"> 

     <legend>Registration</legend> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('firstname')}? 'control-group input error'"> 
      <input type="text" th:field="*{firstname}" 
      placeholder="Firstname" /> <span class="help-block" 
      th:if="${#fields.hasErrors('firstname')}" 
      th:errors="*{firstname}"></span> 
     </div> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('surname')}? 'control-group input error'"> 
      <input type="text" th:field="*{surname}" placeholder="Surname" /> 
      <span class="help-block" 
      th:if="${#fields.hasErrors('surname')}" 
      th:errors="*{surname}"></span> 
     </div> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('email')}? 'control-group input error'"> 
      <input type="text" th:field="*{email}" placeholder="Email" /> 
      <span class="help-block" th:if="${#fields.hasErrors('email')}" 
      th:errors="*{email}"></span> 
     </div> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('password')}? 'control-group input error'"> 
      <input type="password" th:field="*{password}" 
      placeholder="Password" /> <span class="help-block" 
      th:if="${#fields.hasErrors('password')}" 
      th:errors="*{password}"></span> 
     </div> 

     <div class="clearfix"> 
      <input type="submit" class="btn btn-success btn-large" 
      value="Register" /> 
     </div> 

     </form> 

Trả lời

46

tôi thường gọi result.rejectValue("property", "error.object"); thêm lỗi để BindingResult. Nếu bạn muốn thêm lỗi đối tượng chung, bạn có thể sử dụng result.reject("error.object");.

Vì vậy, trong mã của bạn, thay vì:

ObjectError error = new ObjectError("email","An account already exists for this email."); 
result.addError(error); 

thử với:

result.rejectValue("email", "error.user", "An account already exists for this email."); 

Kiểm tra các tài liệu tham khảo here.

Hy vọng điều này sẽ hữu ích.

+0

Tuyệt vời - Tôi không biết phương thức rejectValue. Đó là cố định vấn đề thạch. Cảm ơn –

+0

Giống như chúng tôi đặt ** tin nhắn đã bản địa hoá ** trong 'rejectValue', chúng tôi có thể đặt ** tin nhắn đã bản địa hoá ** tức là" error.user "trong' ObjectError' không? Tôi không thể nhận được thông báo cục bộ nếu tôi sử dụng 'ObjectError'. Tôi đang nhận được tin nhắn được bản địa hoá bằng cách sử dụng 'rejectValue'. Bạn có thể vui lòng giúp đỡ ?? –

+0

Tại sao bạn sử dụng 'ObjectError'? Bạn nên sử dụng phương thức 'rejectValue' thay vì' ObjectError' để thêm lỗi vào bộ điều khiển của bạn. Bằng cách này, bạn sẽ nhận được các tin nhắn được bản địa hoá. – jelies

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