在Spring中表单提交后的空字段

时间:2013-08-29 09:09:58

标签: forms spring data-binding orm model

我有一个具有评级等级属性的产品。我有一个产品更新表单(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的隐藏输入字段。

2 个答案:

答案 0 :(得分:0)

在表单中包含一个隐藏的输入,namevalueRating指定。该值应包括

<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")