【问题标题】:Cannot deserialize value of type `java.lang.String` from Array value from mockmvc无法从 mockmvc 的数组值反序列化类型为“java.lang.String”的值
【发布时间】:2022-02-03 07:53:12
【问题描述】:
public class ModelDTO implements Serializable {

    private Long id;
    private String datasetName;
 
    @JsonRawValue
    private String json;
}

如果我发送以下正文,邮递员或 swagger 的 Post API 工作正常。

{
  "id": 1,
  "datasetName": "Insurance",
  "json" : "[{\"ClassName\":\"AAAA\",\"Fields\":[[\"cdsa\",\"csa\"],[\"ca\"]]},{\"ClassName\":\"ca\",\"Fields\":[null]}]"
}

但 MockMVC 测试用例在 Spring 启动项目中出现以下错误

错误请求:JSON 解析错误:意外字符('C'(代码 67)):期望用逗号分隔对象条目;嵌套异常是 com.fasterxml.jackson.core.JsonParseException: Unexpected character ('C' (code 67)): 期望用逗号分隔对象条目 在 [来源:(PushbackInputStream);行:1,列:89]

mockMvc.perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(ModelDTO))).andExpect(status().isCreated());

【问题讨论】:

    标签: java spring-boot parsing integration-testing mockmvc


    【解决方案1】:

    我相信您实际上并不需要 @JsonRawValue,所以请尝试删除它:

    public class ModelDTO implements Serializable {
        private Long id;
        private String datasetName;
        private String json;
    }
    

    【讨论】:

    【解决方案2】:

    我的 json 设置不正确。它需要反斜杠进行解析。 我添加了额外的两个反斜杠,例如“\”,现在它正在工作。

    private static final String DEFAULT_JSON = "\"[{\\\"ClassName\\\":\\\"Health Aditya Birla\\\",\\\"Fields\\\":[[\\\"Insured Person's Details\\\",\\\"Gender\\\",\\\"Member ID\\\"],[\\\"Policy Details\\\",\\\"Insured Person's Details\\\"],[\\\"Premium Certificate\\\"]]},{\\\"ClassName\\\":\\\"Health Care\\\",\\\"Fields\\\":[[\\\"Details of Insured\\\",\\\"Relationship\\\",\\\"Date Of Birth\\\"],[\\\"Mobile No\\\"],[\\\"Gross Premium\\\",\\\"Goods & Services Tax\\\"]]}]\"";
    

    我已参考以下链接来解决此问题。

    enter link description here

    【讨论】:

      【解决方案3】:

      就我而言,我的类型定义不正确。 例如

      public class ModelDTO implements Serializable {
      
          private Long id;
          private String datasetName;
       
          private String part;
      }
      

      所以我不得不将其更正为:

      public class ModelDTO implements Serializable {
      
          private Long id;
          private String datasetName;
       
          private List<String> part;
      }
      

      这解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2022-09-24
        • 1970-01-01
        • 1970-01-01
        • 2023-01-25
        • 2017-09-06
        • 2017-10-19
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        相关资源
        最近更新 更多