Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST枚举序列化和Spring_Java_Spring_Rest_Enums - Fatal编程技术网

Java REST枚举序列化和Spring

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");

在使用springmvc的restapi中,如果我想将可以作为httpget请求参数传递的字符串值限制为以下值之一

瓦卢亚 瓦卢布

我想我应该在java中使用枚举类型

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…;)