2012-08-24 16 views
14

मैं अपने मॉडल में मैन्युअल रूप से एक व्यक्तिगत ईमेल त्रुटि संदेश जोड़ने की कोशिश कर रहा हूं लेकिन दृश्य में कुछ भी प्रदर्शित नहीं हो रहा है।
मुझे लगता है कि यह हो सकता है कि मैं ऑब्जेक्ट एरर को बाइंडिंग रीसेट में कैसे बना या संलग्न कर रहा हूं।
मैं पकड़ के अंदर त्रुटि जोड़ रहा हूं।कस्टम ऑब्जेक्ट फ़ील्ड्स के लिए स्प्रिंग 3 डेटाबिंडर में त्रुटि संदेश जोड़ना

यहाँ result.errors की सामग्री को जब मैं ईमेल फ़ील्ड रिक्त छोड़ दें और JSR-303 एनोटेशन (ध्यान में रखते हुए त्रुटि प्रदर्शित करता है) में लात है:

[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]] 



यहाँ परिणाम की की सामग्री है। त्रुटियों के बाद मैं मैन्युअल ErrorObject जोड़ने (ईमेल त्रुटि दृश्य में प्रदर्शित नहीं करता है):

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



नियंत्रक:

@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; 
      } 
     } 
    } 

मेरे मॉडल:

@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> 

उत्तर

46

मैं आमतौर पर result.rejectValue("property", "error.object"); फोन BindingResult करने के लिए त्रुटियों को जोड़ने के लिए। यदि आप वैश्विक ऑब्जेक्ट त्रुटि जोड़ना चाहते हैं, तो आप result.reject("error.object"); का उपयोग कर सकते हैं।

तो, अपने कोड, बजाय में:

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

के साथ प्रयास करें:

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

चेक संदर्भ here

उम्मीद है कि इससे मदद मिलती है।

+0

उत्कृष्ट - मुझे अस्वीकार विधि विधि से अवगत नहीं था। इस मुद्दे को जेलीज़ तय कर दिया गया है। धन्यवाद –

+0

जैसे कि हम 'अस्वीकृत' में ** स्थानीयकृत संदेश ** डालते हैं, क्या हम 'ऑब्जेक्ट एरर' में ** localized message ** i.e. "error.user" डाल सकते हैं? यदि मैं 'ऑब्जेक्ट एरर' का उपयोग करता हूं तो मैं स्थानीय संदेश प्राप्त नहीं कर पा रहा हूं। मुझे 'अस्वीकार' का उपयोग कर स्थानीयकृत संदेश मिल रहा है। क्या आप कृपया मदद कर सकते हैं ?? –

+0

आप 'ऑब्जेक्ट एरर' का उपयोग क्यों कर रहे हैं? आपको अपने कंट्रोलर में त्रुटियों को जोड़ने के लिए 'ऑब्जेक्ट एरर' उदाहरण के बजाय 'अस्वीकरण' विधि का उपयोग करना चाहिए। इस तरह आप स्थानीय संदेश प्राप्त करेंगे। – jelies