java - 使枚举不区分大小写
问题描述
我正在构建一个 Spring Boot REST API。它有一个 POST 请求,可将大对象保存到 Mongo 数据库。我正在尝试使用 Enums 来控制数据存储方式的一致性。例如,这是我的对象的一部分:
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 的内容,将其转换为大写,将其与枚举进行比较,如果匹配,则存储/返回枚举。不幸的是,我还没有找到一个好的模式,因此这个问题。预先感谢您的协助!
解决方案
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();
}
}
推荐阅读
- javascript - 在多个 div 上按顺序运行动画而不会超时
- javascript - 在脚本结束或取消之前,Google Sheets Script for loop 不再粘贴
- ios - 从下拉列表中选择两个文件以快速显示在 UITableView 上时出错
- c# - 从 Angular 10 对 Asp.Net Web Api 进行 Http 调用
- c# - c#中如何通过名称访问资源
- reactjs - 如何调整或缩小 React Vis.JS 网络图?
- python - 获取 2 个不同的 django 模型字段之间的数量差异?
- javascript - 如何使用 p5.js 绘制所有表情符号
- angular - 如何更新 NGRX 中的实体顺序?角度 9
- javascript - 使用 AJAX MVC PHP 发送内容 tinyMCE