2013-08-29 47 views
3

我已經獲得了具有評級分級屬性的產品。我有一個產品更新表單(updateStart方法),它不包含評分字段(因爲我不希望它是可編輯的)。表單在春季提交後的空字段

問題是,當我提交表單(使用更新方法)時,評分自動設置爲空。 所以我試圖將update添加到updateStart中的表單模型中,並在更新方法中檢索它,但它也一直在重寫。

我試圖在控制器中設置@SessionAttributes(「rating」)註釋。這次保留了評分值,但Spring會在數據庫中創建一個新條目,從另一個評級對象克隆,並將其附加到產品。

@Controller 
@SessionAttributes("rating") 
@RequestMapping("/products") 
public class ProductsController { 

@RequestMapping("/update_start") 
public String updateStart(@RequestParam("id") Long id, Model model) throws BusinessException { 
    Product product = productService.findProductById(id); 

System.out.println("RATING A START "+product.getRating().getAbsoluteRating()); 

    List<Category> categories = productService.findAllCategories(); 
    model.addAttribute("categories", categories); 
    model.addAttribute("product", product); 
    model.addAttribute("id", id); 
    model.addAttribute("rating",product.getRating()); 
    return "products.updateform"; 
} 

@RequestMapping(value="/update", method = RequestMethod.POST) 
public String update(@ModelAttribute("rating") Rating rating, @ModelAttribute Product product, BindingResult bindingResult) throws BusinessException { 

    System.out.println("RATING A UPDATE "+rating.getAbsoluteRating()); 

    validator.validate(product, bindingResult); 

    List<Image> images = imageService.getProductImages(product.getId()); 

    product.setRating(rating); 

    productService.updateProduct(product,images,sellerid); 
    return "redirect:/products/viewsforsellers.do"; 
} 
} 

我該怎麼辦?

編輯:我寧願避免在我的表單中放置帶有ratingId的隱藏輸入字段。

+0

當您說您將評分添加到表單中時,是添加所有字段還是僅添加了ID?評級是一個實體嗎? –

+0

@KevinBowersox是的,評級是一個實體。我嘗試使用下面的代碼將它添加到模型中(而不是表單輸入):model.addAttribute(「rating」,product.getRating()); –

+0

您表單中的評分是一個下拉菜單? – kiduxa

回答

0

在表格中包含一個隱藏輸入,其中namevalueRating指定。該值應包括

<form> 
    <input name="product.rating" value="${product.rating.id}"/> 
    <!-- Other fields --> 
</form> 

現在,當請求過來的電線也應包括id爲產品指定的Rating

@RequestMapping(value="/update", method = RequestMethod.POST) 
public String update(@ModelAttribute Product product, BindingResult bindingResult) throws BusinessException { 
    //implementation 
} 

@ModelAttribute應嘗試將此參數Product綁定但它是不知道什麼是Rating是。這是一個Converter進場。在數據綁定期間使用A Converter來告訴Spring MVC如何將String類型的字段映射到Rating類型的字段。

public class StringToRatingConverter implements Converter<String, Rating> { 


    public Rating convert(String source) { 
      //Use the source String to convert to rating 
      //Possibly via database call or enum conversion, pending ratings type and definition 
      //Ultimately the code needs to return the appropriate object of type Rating 

      return rating; //The above implementation will create the rating object. 
     } 
    } 

StringToRatingConverter必須再dispatcher配置文件中註冊。

<!-- Register Converters - Used for data binding--> 
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <list> 
      <bean class="fully.qualified.path.to.StringToRatingConverter"/> 
     </list> 
    </property> 
</bean> 

我第一次遇到這種情況,我在post on my blog,你可能會有所幫助捕獲它。

+1

我想避免在我的表單中放置隱藏字段,因爲它可以使用螢火蟲輕鬆修改。此外,如果我將評級ID字段放在表單中,我可以使用它的值直接檢索(使用數據庫查詢)相關評級對象而不使用轉換器。也許我錯過了一些東西。 –

+0

我同意@KurtBourbaki,你有沒有想過這個? –

0

您應該將「types」元素添加到您的@SessionAttributes("rating")註釋中,以保留屬性的順序屬性;例如

@SessionAttributes(types = Rating.class, names = "rating")