如何在控制器中将Object传递给ModelAttribute - Spring

时间:2016-08-31 13:46:13

标签: java spring model-view-controller modelattribute

是否可以使用select标签将对象(car)传递给控制器​​?当我尝试使用以下代码时,无法识别car参数,结果是:

  

400-Bad Request

A car由2个字符串组成(品牌,型号) spot包含1个汽车和2个字符串(town,streetName)

我的jsp页面:

<form:form method="post" modelAttribute="spot" action="${post_url}">        
    <form:select path="car">   
        <form:option value="-" label="--Select car"/>  
        <form:options items="${cars}"/>
    </form:select> 

    <form:input type="text" path="town"/>        
    <form:input type="text" path="streetName"/>            
    <button>Save</button>
</form:form>

我的控制器:

@RequestMapping(value="/addSpot", method = RequestMethod.POST)
public String save(@ModelAttribute("spot") Spot spot){   
    service.addSpotToService(spot);      
    return "redirect:/spots.htm";
}

1 个答案:

答案 0 :(得分:1)

你可以创建一个组件来将Car的Long id转换为object car

@Component
public class CarEditor extends PropertyEditorSupport {

    private @Autowired CarService carService;

    // Converts a Long to a Car
    @Override
    public void setAsText(Long id) {
        Car c = this.carService.findById(id);

        this.setValue(c);
    }

}
在你的控制器中添加

private @Autowired CarEditor carEditor;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Car.class, this.carEditor);
    }

然后在选择

中传递汽车的ID
    <form:select path="car">   
        <form:option value="-" label="--Select car"/>  
        <form:options items="${cars}" itemValue="id" itemLabel="model"/>
    </form:select> 

查看spring文档http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html,特别是选项标记

部分
  

items属性通常使用集合或数组填充   项目对象。 itemValue和itemLabel只是引用bean   这些项目对象的属性,如果指定的话;否则,该项目   对象本身将被字符串化。或者,您可以指定   项目的映射,在这种情况下,映射键被解释为选项   值和地图值对应于选项标签。如果是itemValue   和/或itemLabel碰巧也被指定为项目值   属性将应用于map键和item label属性   适用于地图值。

请告诉我这是否适合您