2016-12-31 3 views
1

Когда проверка контроллера объекта просто обновляет страницу, вместо этого отображаются ошибки через форму: ошибки, можете ли вы сказать мне, где проблема. Я гость он должен получить сообщение об ошибке от связывания результата и вставьте его в страницу, а контроллер просто освежает страницуФорма: ошибка не отображается ошибка

Контроллер:

@PreAuthorize("hasRole('ROLE_ADMIN')") 
@RequestMapping(value = "/create", method = RequestMethod.POST) 
public String createProduct(MultipartFile image, Model model,@ModelAttribute @Valid ProductDto product, BindingResult bindingResult) throws IOException { 
    productValidator.validate(product,bindingResult); 
    if (bindingResult.hasErrors()){ 
     return "admin/create"; 
    } else { 
     return "index"; 
    } 

} 

@PreAuthorize("hasRole('ROLE_ADMIN')") 
@RequestMapping(value = "/create", method = RequestMethod.GET) 
public String createProduct(Model model) { 
    model.addAttribute("product", new ProductDto()); 
    model.addAttribute("categories", categoryService.findAll()); 
    return "admin/create"; 
} 

Validator:

@Override 
public boolean supports(Class<?> aClass) { 
    return ProductDto.class.equals(aClass); 
} 

@Override 
public void validate(Object o, Errors errors) { 

    ProductDto product = (ProductDto) o; 

    if (product.getTitle().isEmpty() || product.getTitle() == null) { 
     errors.rejectValue("title", "product.title", "Product title cant be empty"); 
    } 
    if (product.getDescription().isEmpty() || product.getDescription() == null) { 
     errors.rejectValue("description", "product.description", "Product description cant be empty"); 
    } 
    if (product.getPrice() == null || product.getPrice()<=0) { 
     errors.rejectValue("price", "product.price", "Product price is not valid"); 
    } 
    if (product.getCategoryId()==null) { 
     errors.rejectValue("category", "product.category", "Product category is not valid"); 
    } 

} 

JSTL страница:

      <spring:url value="/product/create" var="formUrl"/> 
         <form:form modelAttribute="product" action="${formUrl }" method="post" enctype="multipart/form-data"> 
          <div class="form-group"> 
           <label>Title</label> 
           <form:input id="title" 
              cssClass="form-control" path="title"/> 
           <form:errors path="title"/> 
          </div> 
          <div class="form-group"> 
           <label>Description</label> 
           <form:textarea id="description" rows="10" 
               cssClass="form-control" path="description"/> 
          </div> 
          <div class="form-group"> 
           <label>Price</label> 
           <form:input id="price" type="number" 
              cssClass="form-control" path="price"/> 
           <form:errors path="description"/> 
          </div> 
          <div class="form-group"> 
           <label for="sel1">Select category</label> 
           <form:select id="sel1" cssClass="form-control" path="categoryId"> 
            <form:options items="${categories}" itemValue="id" itemLabel="title"/> 
           </form:select> 
          </div> 
          <label class="btn btn-default btn-file"> 
           Image <input type="file" multiple accept='image/*' ng-file-select="onFileSelect($files)" name="image" style="display: block;"> 
          </label> 
          <br><br> 
          <div class="text-center"> 
           <button type="submit" class="btn btn-lg btn-success text-center"><span 
             class="fa fa-check"></span> Submit 
           </button> 
           <a href="/" class="btn btn-danger btn-lg text-center"><span 
             class="fa fa-times"></span> Cancel 
           </a> 
          </div> 
         </form:form> 

ответ

0

Я думаю, что ваш атрибут модели product имеет другое имя в y наш POST-обращение способ.

В соответствии с documentation: атрибут

модели по умолчанию имени выводится из объявленного типа атрибута (т.е. типа параметра метода или возврат метода типа), на основе имени неквалифицированного класса: например, «orderAddress» для класса «mypackage.OrderAddress» или «orderAddressList» для «Список <mypackage.OrderAddress>».

Значит, ваш ProductDto product атрибут будет иметь имя productDto в полученной модели. Но вы ссылаетесь на product в свой шаблон.

Try явно установить name атрибут @ModelAttribute аннотацию

public String createProduct(MultipartFile image, Model model, @ModelAttribute(name = "product") @Valid ProductDto product, BindingResult bindingResult) 

И чтобы убедиться, что bidning и проверка на самом деле работает, попробуйте зарегистрировать ее:

if (bindingResult.hasErrors()) { 
    System.err.println("Form has errors!"); 
} 
Смежные вопросы