没有调用initBinder方法从String转换为Enum

时间:2013-05-28 20:18:05

标签: java spring-3 property-editor spring-mvc-initbinders

我正在测试@InitBinder注释,因此我可以在网络请求期间将String个对象转换为适当的Enum对象。

我创建了以下简单的Enum

SampleEnum.java

public enum SampleEnum {
    ONE,
    TWO,
    THREE,
    FOUR,
    FIVE;
}

然后,我创建了一个扩展PropertyEditorSupport的编辑器,以便从@InitBinder代码中调用:

EnumPropertyEditor.java

@SuppressWarnings("rawtypes")
public class EnumPropertyEditor extends PropertyEditorSupport {
    private Class clazz;

    public EnumPropertyEditor(Class clazz) {
        this.clazz = clazz;
    }

    @Override
    public String getAsText() {
        return (getValue() == null ? "" : ((Enum) getValue()).name());
    }

    @SuppressWarnings("unchecked")
    @Override
    public void setAsText(String text) {
        Enum e = Enum.valueOf(clazz, text);
        setValue(e);
    }
}

然后,在我的控制器中,我添加了@InitBinder和一个简单的请求映射:

控制器

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(SampleEnum.class, new EnumPropertyEditor(SampleEnum.class));
}

@RequestMapping(method = POST, value = "/postSampleEnum")
@ResponseBody
public SampleEnum postSampleEnum(@RequestBody SampleEnum sampleEnum) {
    return sampleEnum;  
}

根据我的理解,对此控制器方法的请求应尝试将字符串值转换为SampleEnum对象。但是,initBinder,请求映射方法或EnumPropertyEditor中的任何方法都没有出现断点。

我正在使用FireFox中的RESTClient进行测试,并尝试在请求正文“THREE”中发送,我希望能够使用它。相反,无论请求主体中有什么,我都会收到415错误。 (服务器拒绝了此请求,因为请求实体所采用的方法所请求的资源不支持该格式()。)

如果我将请求映射更改为接受字符串而不是SampleEnum,则会调用postSampleEnum并且不使用自定义编辑器(如预期的那样)。

我是否遗漏了任何允许调用自定义编辑器代码的内容?继续调试它的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

首先,我忘了将application / json内容类型添加到RESTClient中的请求标头中。 > _<

whoops

但是,我注意到代码执行仍然没有通过自定义属性编辑器。正如GriffeyDog所说,看起来代码只有在我切换到RequestParamModelAttribute时才会执行。