为什么我无法将Ajax发送的数据绑定到控制器中的控制器选项 modelAttribute?
我的ajax电话
$.ajax({
type: "POST",
url: url,
data: { "option.price": 5.99,
"option.owner": "15463"},
dataType: "json",
success: function(data) {
if (data == "error") {
$('.error-message').show();
$('.success-message').hide();
}
else {
$('.success-message').show();
$('.error-message').hide();
}
}
我的选项类
@Entity
public class Option extends Entity {
private User owner;
private Float price;
/* getters / setters */
}
我的控制器
@RequestMapping(value = "/ajax/save", method = RequestMethod.POST)
public @ResponseBody
String saveSinglePtaOptions(@ModelAttribute("option") Option option)
请求成功进入此控制器方法映射。 选项对象始终为null。
我有一个转换器,它通过从数据库中检索将String id转换为User对象,但从未调用过它。而且我很确定转换器能够正常工作。
由于
答案 0 :(得分:0)
尝试使用@RequestBody
代替@ModelAttribute
答案 1 :(得分:0)
也许有更简单的决定,但我会这样做(我没有测试它,但认为它应该有用):
使用@RequestBody
并编写自己的HandlerMethodArgumentResolver
实现来捕获Option
类型的参数:
public class OptionArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(Option.class) ? true : false;
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
Object option = getRequestResponseBodyMethodProcessor()
.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
WebRequestDataBinder binder = new WebRequestDataBinder(option);
binder.setConversionService(conversionService);
binder.bind(webRequest);
return option;
}
}
不要忘记注册。例如,在mvc:annotation-driven
标记中:
<mvc:annotation-driven conversion-service="conversionService">
<mvc:argument-resolvers>
<bean class="your.beautiful.package.OptionArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
通过将@RequestBody
方法主体更改为:
supportsParameter()
注释的每个属性
return getRequestResponseBodyMethodProcessor().supportsParameter(methodParameter);