无法转换类型'java.lang.String'的属性值 - 在Spring中使用另一个对象接收对象

时间:2016-05-25 11:09:16

标签: java ajax spring rest spring-mvc

我正在尝试从Spring中的控制器接收一个带有另一个对象的对象,但是我收到了这个错误:

我正在拨打电话:

$("#form").ajaxForm({
type: "POST",
headers: {
    Authorization: $cookieStore.get("userPassword"),
    FeatureName: name,
},
success: function (data) {
    console.log("reload page");


},
dataType: "text"
}).submit();

我收到错误:

Failed to convert property value of type 'java.lang.String' to required type 'com.Option' for property 'option'

这是整个输出行:

org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'modelDTO' on field 'option': rejected value [{"id":3,"optionName":"Other"}]; codes [typeMismatch.modelDTO.option,typeMismatch.option,typeMismatch.com.Option,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modelDTO.option,option]; arguments []; default message [option]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.Option' for property 'option'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.Option] for property 'option': no matching editors or conversion strategy found]

这是我的控制者和DTO

@RequestMapping(value = "/save", method = RequestMethod.POST)
@Transactional 
public @ResponseBody void save(@ModelAttribute("form") ModelDTO model)
...

public class ModelDTO implements Serializable 
{

    private static final long serialVersionUID = 3276874897891652914L;
    private Long userId;
    private Option option;

    public Long getUserId()
    {
        return userId;
    }

    public void setUserId(Long userId)
    {
        this.userId = userId;
    }

    public Option getOption()
    {
        return option;
    }

    public void setOption(Option option)
    {
        this.option = option;
    }

}

春天允许这项工作吗?

2 个答案:

答案 0 :(得分:0)

由于您是通过请求方法POST向控制器发送数据,因此您需要使用ModelDTO model注释@RequestBody并删除@ResponseBody,除非您的方法实际上是假设的返回一些东西。另外,请确保您通过表单发送的数据实际上与ModelDTO匹配。

答案 1 :(得分:0)

我得到了解决方案,我不需要更改任何代码,只需在我正在进行绑定的控制器中添加initBinderAll。通过此解决方案,我们可以处理未自动转换的数据。

像:

@InitBinder
    public void initBinderAll(WebDataBinder binder) 
    {
        binder.registerCustomEditor(Option.class,  new OptionPropertyEditor());
    }

并创建自定义PropertyEditorSupport,如:

public class OptionPropertyEditor extends PropertyEditorSupport