4

我有一个带有评级评级属性的产品。我有一个不包含评级字段的产品更新表单(updateStart 方法)(因为我不希望它是可编辑的)。

问题是当我提交表单(使用更新方法)时,评级自动设置为空。所以我尝试在 updateStart 中将 Rating 添加到表单模型中,并在 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 的隐藏输入字段。

4

2 回答 2

0

在表单中包含一个隐藏输入,其中namevalue为 指定Rating。该值应包括

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

现在,当请求通过网络传输时,它应该包含产品的Rating指定 by id

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

@ModelAttribute应该尝试将此参数绑定到,Product但是它不知道 aRating是什么。这就是 aConverter发挥作用的地方。在数据绑定期间使用AConverter来告诉 Spring MVC 如何将 type 字段映射到 typeString字段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>

我第一次遇到这种情况时,我在我的博客上的一篇文章中捕捉到了它,你可能会有所帮助。

于 2013-08-29T09:27:58.877 回答
0

您应该在@SessionAttributes("rating")注释中添加“类型”元素,以便保留属性的属性;例如

@SessionAttributes(types = Rating.class, names = "rating")
于 2016-07-04T10:18:46.073 回答