2014-12-22 59 views
0

的模型我創建了一個表單,它有2個字段(產品名稱和價格)以及類別對象(產品類別)的下拉列表。 我不知道如何使這項工作,當我有一個類別對象設置在產品對象。Spring MVC表單 - 參考對象

產品:

public class Product { 
    private String name; 
    private Category category; 
    private int price; 

    public Product() { 
    } 

    public Product(String name, Category category, int price) { 
     this.name = name; 
     this.category = category; 
     this.price = price; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Category getCategory() { 
     return category; 
    } 

    public void setCategory(Category category) { 
     this.category = category; 
    } 

    public int getPrice() { 
     return price; 
    } 

    public void setPrice(int price) { 
     this.price = price; 
    } 

} 

產品控制器:

@ModelAttribute("categoryList") 
    public List<Category> categoryList() { 
      return categoryService.getCategories(); 
    } 

    @RequestMapping("/products/add") 
    public ModelAndView addProductForm() { 
     ModelAndView mv = new ModelAndView("addProduct"); 

     mv.addObject("product", new Product()); 
     return mv; 
    } 
    @RequestMapping(value = "/products/add/process", method = RequestMethod.POST) 
    public ModelAndView addProduct(@ModelAttribute("product") Product product) { 
     ModelAndView mv = new ModelAndView("products"); 
     System.out.println("added " + product.getName() + " " + product.getPrice()); 
     return mv; 
    } 

形式:

<form class="form-horizontal" action="#" 
     th:action="@{/products/add/process}" th:object="${product}" 
     method="post"> 
     <fieldset> 

      <!-- Form Name --> 
      <legend>Add product</legend> 

      <!-- Text input--> 
      <div class="form-group"> 
       <label class="col-md-4 control-label" for="textinput">Product 
        name</label> 
       <div class="col-md-4"> 
        <input id="textinput" name="textinput" placeholder="Product name" 
         class="form-control input-md" required="" type="text" 
         th:field="*{name}"></input> 
       </div> 
      </div> 

      <!-- Select Basic --> 
      <div class="form-group"> 
       <label class="col-md-4 control-label" for="selectbasic">Category</label> 
       <div class="col-md-4"> 
        <select th:field="*{category}"> 
         <option th:each="cat : ${categoryList}" th:value="${cat.getId()}" 
          th:text="${cat.getName()}"></option> 
        </select> 
       </div> 
      </div> 

      <!-- Text input--> 
      <div class="form-group"> 
       <label class="col-md-4 control-label" for="textinput">Price</label> 
       <div class="col-md-4"> 
        <input id="textinput" name="textinput" placeholder="" 
         class="form-control input-md" required="" type="text" 
         th:field="*{price}"></input> 
       </div> 
      </div> 

      <!-- Button --> 
      <div class="form-group"> 
       <label class="col-md-4 control-label" for="singlebutton"></label> 
       <div class="col-md-4"> 
        <button id="singlebutton" name="singlebutton" 
         class="btn btn-success">Add product</button> 
       </div> 
      </div> 
     </fieldset> 
    </form> 

附加從評論
當我SUBM信息它它(見addProduct方法 - 這是一個表單處理程序)我得到:java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.example.shop.Category] for property 'category': no matching editors or conversion strategy found]。我簡直無法將字符串從下拉菜單轉換爲對象

+0

所以我明白的問題正確:該類別的下拉是空的,因爲你永遠不會設置它。你如何獲得填充值並返回到表單? – Ascalonian

+0

@Ascalonian我在下拉菜單中顯示它們,我使用ModelAttribute註釋將它們作爲列表傳遞(我使用categoryService獲取它)。 – tomdavies

+0

然後我不明白「如何使這項工作」的意思,因爲你說下拉顯示值。你能更詳細地描述你想要完成的事情嗎? – Ascalonian

回答

1

問題是,Spring沒有從StringCategory的內置轉換功能。它知道它需要Category才能使用ProductsetCategory(Category category)方法,但無法將您從發佈的下拉菜單中獲得的String轉換爲一個。因此,您需要成爲一名親愛的人,告訴它如何進行轉換並定義一個轉換器,以幫助其他人,請參閱Spring docs瞭解更多信息。

最簡單的方法是使用轉換器SPI:

package com.example.shop.converter; 

final class StringToCategoryConverter implements Converter<String, Category> { 
    public Category convert(String source) { 
    Category category; 

    // Put your conversion logic here 

    return category; 
    } 
} 

在你的情況,我想你想使用:CategoryService.getCategory(int id)或類似的方法。

然後,你需要春天配置實際使用的轉換器,下面是如何做到這一點的XML例子:

<mvc:annotation-driven conversion-service="conversionService" /> 

<bean id="conversionService" 
     class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <list> 
      <bean class="com.example.shop.converter.StringToCategoryConverter" /> 
     </list> 
    </property> 
</bean> 
+0

非常感謝!你是對的 - 我添加了一個轉換器:)。 更重要的是 - 如果你有「註解驅動的」啓用後,您還需要這種方式註冊您的轉換器: tomdavies

+0

好一點,編輯的答案,包括它適用於任何人後來到這裏。 – t0mppa