在使用Spring MVC的REST api中,如果我想将可以作为超文本传输协议GET请求参数传递的字符串值限制为以下参数之一
价值A价值B
我认为我应该在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;
}
}
然而,这只处理Enum的序列化。当我在Spring控制器中接收value eA
作为请求Param时,会出现ConversionFailedException
,因为
我已经阅读了下面的文章https://www.baeldung.com/spring-enum-request-param但我的问题是,有没有比编写自定义转换器更简单的解决方案。
我不想为我想在我的REST api中交换的每个枚举编写和注册一个转换器。
我也尝试过这样做,但spring mvc似乎没有调用forValue来反序列化参数。
公共枚举MyEnum{
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的StringToEnumConverterFactory,它要求您按字面形式发送枚举文字-因此在您的情况下,值a或值B。如果您决定用文字以外的任何其他值来标识枚举,您只需要一个更复杂的转换器,但请注意,拥有自己的转换器的方法也有它的注意事项,正如我们在您的示例中看到的那样,因为与枚举文字(编译器检查其是否唯一)相比,例如,您的值不一定是唯一的,就像在您的示例中,两个文字都有值“valueA”,因此映射不会不同。
问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。
问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因
我使用的是JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@jsonValue,这似乎完成了它将对象序列化为:
问题内容: 枚举被认为是单例的最佳方式,其原因之一是它隐式继承。 但是,枚举如何防止单例的反序列化问题? 问题答案: 序列化机制以特殊的特定方式处理它们。但是,可以通过定义返回唯一实例的方法来对传统的单例进行反序列化。有关示例,请参见http://www.oodesign.com/singleton- pattern.html 。
如何用gson 2.2.4序列化和反序列化像这样的简单枚举?
问题内容: 我有一个下面的枚举: 我用控制器()返回枚举数组,Spring将其序列化为以下json字符串: 强迫Jackson像POJO一样序列化枚举的最佳方法是什么?例如: 我使用了不同的注释,但无法获得这样的结果。 问题答案: 终于我找到了解决方案。 我必须用注释枚举并实现自定义序列化程序: