Java REST枚举序列化和Spring
在使用springmvc的restapi中,如果我想将可以作为httpget请求参数传递的字符串值限制为以下值之一 瓦卢亚 瓦卢布 我想我应该在java中使用枚举类型Java REST枚举序列化和Spring,java,spring,rest,enums,Java,Spring,Rest,Enums,在使用springmvc的restapi中,如果我想将可以作为httpget请求参数传递的字符串值限制为以下值之一 瓦卢亚 瓦卢布 我想我应该在java中使用枚举类型 public enum MyEnum { @JsonProperty("valueA") VALUE_A("valueA"), @JsonProperty("valueB") VALUE_B("valueB");
public enum MyEnum {
@JsonProperty("valueA")
VALUE_A("valueA"),
@JsonProperty("valueB")
VALUE_B("valueB");
private final String label;
private MyEnum(String label) {
this.label = label;
}
@Override
public String toString() {
return this.label;
}
@JsonValue
public String getLabel() {
return label;
}
}
但是,这只处理枚举的序列化。当我在spring控制器中接收到作为请求参数的valueA
时,会出现conversionfailedeexception
,因为
我读过下面的文章,但我的问题是,有没有比编写自定义转换器更简单的解决方案。
我不想为我想在RESTAPI中交换的每个枚举编写和注册转换器
我也尝试过这个方法,但是SpringMVC似乎没有调用forValue来反序列化参数
公共枚举髓鞘{
VALUE_A("valueA"),
VALUE_B("valueB");
private final String label;
private MyEnum(String label) {
this.label = label;
}
@Override
public String toString() {
return this.label;
}
@JsonValue
public String getLabel() {
return label;
}
@JsonCreator
public MyEnum forValue(String label) {
for (MyEnum enum: MyEnum .values()) {
if (enum.getLabel().equals(label)) {
return enum;
}
}
throw new IllegalArgumentException("Can't find MyEnum Enum to match :" + label);
}
}如果您不想编写转换器,您当然可以回到Spring,它要求您按字面形式发送枚举文本-因此在您的情况下
VALUE\u a
或VALUE\u B
。如果您决定使用除文本以外的任何其他值来标识枚举,那么您只需要一个更复杂的转换器,但是请注意,拥有自己的转换器的方法有它的注意事项,正如我们在您的示例中看到的,因为与枚举文本(编译器检查它是否唯一)相比,e。G您的值不必是唯一的,就像在您的示例中,两个文本都有值“valueA”,因此映射不会是不同的。对于常规类/Bean对象,这可能是可能的,但您在这里处理的是枚举,所以我猜你需要做一个自定义转换器。你考虑过在自定义方法上使用@JsonCreator
来执行反序列化吗?我已经添加了@JsonCreator的示例,但Spring MVC没有调用它。。要反序列化RequestParam参数。。我认为这是有意义的,因为参数是字符串而不是json…;)