Java Spring4枚举为控制器参数

Java Spring4枚举为控制器参数,java,spring,enums,Java,Spring,Enums,以后编辑 我所描述的案例运作正常。当我在控制器的方法上有类似的内容时,就会出现问题: @RestController public class MyController { @RequestMapping(...) public void myMethod(@RequestBody MyForm myform) { ... } } public class MyForm { private X x; //setters and getters } 原因 给定Request

以后编辑

我所描述的案例运作正常。当我在控制器的方法上有类似的内容时,就会出现问题:

@RestController 
public class MyController {
  @RequestMapping(...)
  public void myMethod(@RequestBody MyForm myform) { ... }
}

public class MyForm {
  private X x;
  //setters and getters
}

原因

给定RequestBody,Spring将使用HttpMessageConverter将请求体反序列化为给定类型的实例。在本例中,它将为JSON使用MappingJackson2HttpMessageConverter。此转换器根本不涉及您的PropertyEditor支持

还有别的选择吗?在这种情况下,我需要使用
@RequestBody
,或者找到一种方法将
X
放入
myform


我想将枚举作为参数放入REST控制器的方法中

这就是我到目前为止得到的

枚举:

public enum X {
  A("A"),B("B"),C("C");
  ... methods and constructors ...
}
控制员:

@RestController 
public class MyController {
  @RequestMapping(...)
  public void myMethod(@PathVariable("x") X x) { ... }
}
配置:

@ControllerAdvice
public class GlobalControllerConfig {
    @InitBinder
    public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
      binder.registerCustomEditor(X.class, new XPropertyEditor());
    }
}
属性编辑器:

public class XPropertyEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) {
        try {
            setValue(X.findByName(text));
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("Custom binding failed. Input type: String. Expected type of value to be set: X", e);
        }
    }

    @Override
    public String getAsText() {
        return ((X)getValue()).getName();
    }
}
我在我的
@ControllerAdvice
中放置了一个断点,每次向我的任何控制器发出请求时,它都会通过该绑定。这使我认为绑定是正确的

当我向我的方法发送请求时,我得到了这个结果,我不明白为什么:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not construct instance of ...X from String value 'A': value not one of declared Enum instance names: [A, B, C]

有什么建议吗?

尝试将@RequestVariable更改为@RequestParameter

我将更改setAsText方法行,如下所示:

@Override
public void setAsText(String text) {
    try {
        String upperText = text.toUpperCase(); 
        X xResult = X.valueOf(upperText);
        setValue(xResult);
    } catch (IllegalArgumentException e) {
        throw new IllegalArgumentException("Custom binding failed. Input type: String. Expected type of value to be set: X", e);
    }
}

你的要求到底是什么样的?