首页 > 解决方案 > 无法读取 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

标签: javajson

解决方案


您可以通过更新您的枚举来做到这一点:

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方法。


推荐阅读