我有一个具有评级等级属性的产品。我有一个产品更新表单(updateStart方法),它不包含评级字段(因为我不希望它可以编辑)。
问题在于,当我提交表单(使用更新方法)时,评级会自动设置为null。 所以我尝试将评级添加到updateStart中的表单模型,在update方法中检索它,但它也一直被重写。
我尝试在控制器中设置@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 :(得分:0)
在表单中包含一个隐藏的输入,name
和value
为Rating
指定。该值应包括
<form>
<input name="product.rating" value="${product.rating.id}"/>
<!-- Other fields -->
</form>
现在,当请求通过电汇时,它应包含Rating
为产品指定的id
。
@RequestMapping(value="/update", method = RequestMethod.POST)
public String update(@ModelAttribute Product product, BindingResult bindingResult) throws BusinessException {
//implementation
}
@ModelAttribute
应尝试将此参数绑定到Product
但是它不知道Rating
是什么。这是Converter
发挥作用的地方。在数据绑定期间使用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 :(得分:0)
你应该添加&#34;类型&#34;元素到您的@SessionAttributes("rating")
注释,以便保留属性的属性; e.g。
@SessionAttributes(types = Rating.class, names = "rating")