当前位置: 首页 > 知识库问答 >
问题:

使枚举不区分大小写[重复]

终翔
2023-03-14

我正在构建一个Spring Boot REST API。它有一个POST请求,用于将大型对象保存到Mongo数据库。我试图使用枚举来控制数据存储方式的一致性。例如,这是我对象的一部分:

public class Person{
   private String firstName;
   private String lastName:
   private Phone phone;
}
public class Phone {
    private String phoneNumber;
    private String extension;
    private PhoneType phoneType;
}
public enum PhoneType {
    HOME("HOME"),
    WORK("WORK"),
    MOBILE("MOBILE");

    @JsonProperty
    private String phoneType;

    PhoneType(String phoneType) {
        this.phoneType = phoneType.toUpperCase();
    }

    public String getPhoneType() {
        return this.phoneType;
    }
}

我的问题:当我传入一个不是我的枚举的大写版本的值(例如“mobile”或“Mobile”)时,我得到以下错误:

JSON parse error: Cannot deserialize value of type `.......PhoneType` from String "mobile": not one of the values accepted for Enum class: [HOME, WORK, MOBILE]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `......PhoneType` from String "mobile": not one of the values accepted for Enum class: [HOME, WORK, MOBILE]

我觉得应该有一种相对简单的方法来获取传递到API中的内容,将其转换为大写字母,将其与枚举进行比较,如果匹配,则存储/返回枚举。不幸的是,我还没有找到一个好的模式可以工作,因此有这个问题。提前感谢您的协助!

共有1个答案

蓟安歌
2023-03-14

Berto99的评论让我得到了正确的答案:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public enum PhoneType {
    HOME("HOME"),
    WORK("WORK"),
    MOBILE("MOBILE");

    private String phoneType;

    PhoneType(String phoneType){
        this.phoneType = phoneType;
    }

    @JsonCreator
    public static PhoneType fromString(String phoneType) {
        return phoneType == null
            ? null
            : PhoneType.valueOf(phoneType.toUpperCase());
    }

    @JsonValue
    public String getPhoneType() {
        return this.phoneType.toUpperCase();
    }
}
 类似资料:
  • 问题内容: 如何反序列化包含不区分大小写的枚举值的JSON字符串?(使用Jackson Databind) JSON字符串: 和我的Java POJO: 在这种情况下,使用JSON反序列化将在可行的地方失败。但出于命名约定的原因,我也想工作。 序列化POJO也会导致大写 我想到了使用@JsonGetter: 而且有效。但是我想知道是否有更好的解决方案,因为这对我来说似乎是hack。 我也可以编写一

  • 枚举 场域 Application.Properties(小写)

  • 问题内容: 如果我像这样在Spring控制器中有一个RequestMapping … 产品是一个枚举。例如。产品首页 当我请求页面时,mysite.com / home 我懂了 有没有办法让枚举类型转换器理解小写的home实际上是Home? 我想保持url大小写不敏感,并且我的Java枚举使用标准大写字母。 谢谢 解 注册 添加到需要特殊转换的控制器 问题答案: 概括地说,您想创建一个新的Prop

  • 我试图重写/实现JSR311中的所有属性,但Jersey绑定似乎区分大小写: 做一个原始类型 有一个接受单个String参数的构造函数 有一个静态方法命名为value eOf或from mString,它接受单个String参数(例如,参见Integer.valueOf(String)) 是List、Set或sortedSet,其中T满足上面的2或3。生成的集合是只读的。 如何使枚举的泽西绑定不区

  • 对于报告(0.1%的所有查询),我需要返回一个所有可能类别的列表,区分大小写! 考虑以下文件: 运行以下查询: 返回: 是否有方法返回区分大小写的类别(存储在文档中)?我对此查询结果中的感兴趣。 Elasticsearch论坛中的问题 谢谢,伊泰