Spring绑定不能使用没有表单的ajax

时间:2013-05-31 08:45:49

标签: ajax spring binding

为什么我无法将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对象,但从未调用过它。而且我很确定转换器能够正常工作。

由于

2 个答案:

答案 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);