java - 无法读取 JSON:无法从字符串值构造实例
问题描述
我有 pojo 课票
public class Ticket implements Serializable{
@JsonProperty("lineItemStatus")
private String revisionStatus;
public String getRevisionStatus() {
return revisionStatus;
}
public void setRevisionStatus(String revisionStatus) {
this.revisionStatus = revisionStatus;
}
public void setRevisionStatus(RevisionStatus revisionStatus) {
String status = "";
if (revisionStatus != null) {
switch (revisionStatus) {
case added: {
status = "New";
break;
}
case updated: {
status = "Modified";
break;
}
}
}
this.revisionStatus = status;
}
}
我也有一个枚举
public enum RevisionStatus {
added {
@Override
public String getName() {
return this.name();
}
},
updated {
@Override
public String getName() {
return this.name();
}
}
public abstract String getName();
}
在 GET 请求期间,我使用setRevisionStatus(RevisionStatus revisionStatus)
方法并得到响应,例如
{"lineItemStatus": "Modified"}
这很好但是在 PUT 请求期间出现问题。在 PUT 请求期间,我的要求是我应该能够发送像 for {"lineItemStatus": "Modified"}
or {"lineItemStatus": "New"}
or这样的有效负载{"lineItemStatus": "abc"}
,这意味着lineItemStatus
应该能够接受任何 String value 。我@RequestBody Ticket ticket
用于接收有效载荷。调试器没有进入控制器内部并且在有效载荷步骤失败。如何在不进行任何更改的情况下处理此错误Enum
?
解决方案
您可以通过更新您的枚举来做到这一点:
public enum RevisionStatus {
added("New") {
@Override
public String getName() {
return this.name();
}
},
updated("Modified") {
@Override
public String getName() {
return this.name();
}
};
private String status;
private RevisionStatus(String status) {
this.status = status;
}
public abstract String getName();
/**
* @return the status
*/
public String getStatus() {
return status;
}
@JsonCreator
public static RevisionStatus fromValue(String text) {
if(StringUtils.isNoneBlank(text)) {
for (RevisionStatus b : RevisionStatus.values()) {
if (String.valueOf(b.toString()).equalsIgnoreCase(text.trim())) {
return b;
}
}
}
return null;
}
}
在这里,我们将枚举更新为值枚举。并且fromValue()
带有@JsonCreator
注解的方法会将此 String 值与 Enum 常量绑定。
switch
此外,通过这种方式,您在 get 方法期间将不需要这种情况。AsgetStatus()
方法将直接为您提供状态值。这也将改善您的代码设计。
这里只是补充一点,我觉得不需要这个getName()
方法,因为放置的地方getName()
被调用,直接name()
调用就可以了。因为这也是一种public
方法。
推荐阅读
- sql - 从一张表中删除另一张表中的数据
- java - 从 2 个 BLE 连接的设备并行获取数据
- javascript - 如何停止执行componentwillmount中的功能或动作?
- ruby-on-rails - 在自定义类中设计未定义的辅助方法
- java - 使用 java8 流 api 从列表中检索单个对象
- php - /autoload.php): 无法打开流: 没有这样的文件或目录
- mysql - Docker - mysqld:表'mysql.plugin'不存在
- actions-on-google - 谷歌助手:里面的温度是多少?没有到达终点
- javascript - 解析 API 数据并在多个地方使用它
- python - 如何使用 OpenCV 直接读取 tarfile 对象