0

为什么我无法将 Ajax 发送的数据绑定到控制器中的控制器Option 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)

并且请求成功进入这个控制器方法映射。选项对象始终为空。

我有一个转换器,它通过从数据库中检索将 String id 转换为 User 对象,但它从未被调用过。我很确定转换器可以工作。

谢谢

4

2 回答 2

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);
于 2013-05-31T10:44:11.253 回答
0

尝试使用 @RequestBody而不是@ModelAttribute

于 2013-05-31T09:37:47.613 回答