2015-04-19 5 views
3

Вот мой контроллерSpring MVC не отображается форма Ошибки

@RequestMapping(value = "/save",method = RequestMethod.POST) 
public ModelAndView saveUserAccount(@ModelAttribute("account") UserAccountForm userAccount, BindingResult result){ 
    AddUserValidator userValidator = new AddUserValidator(); 
    userValidator.validate(userAccount,result); 
    boolean hasErrors = result.hasErrors(); 
    if(hasErrors){ 
     return render(ADD_USER_VIEW) 
      .addAttr("ACCOUNT_ROLES", Arrays.asList(AccountRole.values())) 
      .addAttr("TENANTS",tenantInfoService.getAll()) 
      .addAttr("errors",result) 
      .addAttr("account",userAccount).toMav(); 
    } 
    return render(ADD_USER_VIEW) 
     .addAttr("ACCOUNT_ROLES", Arrays.asList(AccountRole.values())) 
     .addAttr("TENANTS",tenantInfoService.getAll()) 
     .addAttr("account",new UserAccountForm()) 
     .toMav(); 
} 

Вот библиотека визуализации, что я создал.

public class RenderMavBuilder { 

    private final ModelAndView mav; 

    public static RenderMavBuilder render(String viewname){ 
     RenderMavBuilder target = new RenderMavBuilder(viewname); 
     return target; 
    } 

    public RenderMavBuilder addAttr(String attrName, Object value){ 
     mav.addObject(attrName, value); 
     return this; 
    } 

    public RenderMavBuilder addAttr(Object value){ 
     mav.addObject(value); 
     return this; 
    } 

    public RenderMavBuilder addAttrs(Map<String , ?> attrs){ 
     mav.addAllObjects(attrs); 
     return this; 
    } 

    private RenderMavBuilder(String viewName){ 
     this.mav = new ModelAndView(viewName); 
    } 

    public ModelAndView toMav(){ 
     return mav; 
    } 
} 

Вот мой валидатор

Вот моя форма.

 <div class="col-md-6 centered"> 
      <form:errors path="*" /> 
      <form:form commandName="account" method="post" action="${pageContext.request.contextPath}/user/save"> 
       <!-- Username --> 
       <div class="col-xs-12 form-group"> 
        <label class="control-label">Username</label> 
        <form:input path="username" type="text" class="form-control" /> 
       </div> 
       <!-- Password --> 
       <div class="col-xs-12 form-group"> 
        <label class="control-label">Password</label> 
        <form:password path="password" class="form-control"/> 
       </div> 


       <!-- Password --> 
       <div class="col-xs-12 form-group"> 
        <label class="control-label">Password</label> 
        <form:password path="retypedPassword" class="form-control"/> 
       </div> 

       <!-- First Name --> 
       <div class="col-xs-12 form-group"> 
        <label class="control-label">First Name</label> 
        <form:input path="firstName" type="text" class="form-control"/> 
       </div> 

       <!-- First Name --> 
       <div class="col-xs-12 form-group"> 
        <label class="control-label">Last Name</label> 
        <form:input path="lastName" type="text" class="form-control"/> 
       </div> 

       <!-- User Role --> 
       <div class="col-xs-12 form-group"> 
        <label class="control-label">User Role</label> 
        <form:select path="accountRole" class="form-control"> 
         <form:options items="${ACCOUNT_ROLES}"/> 
        </form:select> 
       </div> 

       <!-- Branch Designation --> 
       <div class="col-xs-12 form-group"> 
        <label class="control-label">Designated Branch</label> 
        <select path="tenantId" items="${TENANTS}" class="form-control"> 
         <c:forEach var="branch" items="${TENANTS}"> 
          <option value="${branch.id}">${branch.tenantDescription}</option> 
         </c:forEach> 
        </select> 
       </div> 
       <!-- Button --> 
       <div class="col-md-12 form-group"> 
        <button class="form-control btn btn-primary submit-button" type="submit">Save New User <i class="fa fa-check-square-o"></i></button> 
       </div> 
      </form:form> 

На моем контролере результат привязки имеет ошибки. однако, ошибка не отображается в представлении, что мне не хватает?

+0

Я считаю, что весна не выглядит ваши возвращенные ошибки из модели объекта, как вы вернетесь сюда '.addAttr («ошибка», результат)', почему вы не просто возвращение того же точка зрения в любом случае проверки, когда потерпит неудачу? Кроме того, этот обертку «RenderMavBuilder» кажется бесполезной. Было бы удобнее просто построить «ModelAndView» прямо там. Вы можете попытаться добавить «Модель» в свою подпись и передать ее при возвращении. – Vaelyr

+0

@Vaelyr как вернуть тот же вид с моей данной сигнатурой метода? помочь привести пример? – user962206

ответ

0

Проблема заключается в том, как вы строите свой ModelAndView, вы должны использовать объект Errors для его создания. Используйте Errors.getModel(), чтобы получить базовый Map, который представляет модель и использует это, рядом с именем вида, для построения ModelAndView.

Рядом с этим для других атрибутов модели вы должны просто добавить @ModelAttribute аннотированные методы для их получения. Я также предложил бы добавить метод, основанный на GET, который вы перенаправляете после успешной отправки.

Ваш вспомогательный класс кажется также довольно бессмысленным, поскольку его просто внутри вашего контроллера упростит ваш код (imho).

Ваш контроллер может выглядеть как-то вдоль этих линий.

@RequestMapping(value = "/save",method = RequestMethod.POST) 
public ModelAndView saveUserAccount(@ModelAttribute("account") UserAccountForm userAccount, BindingResult result){ 
    AddUserValidator userValidator = new AddUserValidator(); 
    userValidator.validate(userAccount,result); 
    boolean hasErrors = result.hasErrors(); 
    return new ModelAndView(hasErrors ? ADD_USER_VIEW, "redirect:/add", errors.getModel()); 
} 

@RequestMapping(value="/add") 
public String addUserAccount(Model model) { 
    model.addObject("account", new UserAccountForm()); 
    return ADD_USER_VIEW; 
} 

@ModelAttribute 
public void referenceData(Model model) { 
    model.addObject("ACCOUNT_ROLES", Arrays.asList(AccountRole.values())); 
    model.addObject("TENANTS",tenantInfoService.getAll()); 
} 
Смежные вопросы