【问题标题】:Deserialization exception while POSTing nested json to Spring controller将嵌套 json 发布到 Spring 控制器时出现反序列化异常
【发布时间】:2017-06-15 06:51:53
【问题描述】:

我正在使用 Spring,以下是我的控制器代码:

@RequestMapping(value = "/campaigns/addTask", method = RequestMethod.POST)
public Campaign addTaskToCampaign(@RequestParam(value = "campaignName")String campaignName,@Valid @RequestBody Task task) {
  Campaign campaign = campaignInterface.findByName(campaignName);
  if (campaign!=null){
    List<String> task_ids;
    if (campaign.getTask_ids()==null){
      task_ids = new ArrayList<>();
    }else{
      task_ids= campaign.getTask_ids();
    }
    Task newTask = taskInterface.save(task);
    task_ids.add(newTask.getId());
    campaign.setTask_ids(task_ids);
    return campaignInterface.save(campaign);
  }
  return null;
}

我的任务模型在哪里:

@Document(collection = "tasks")
public class Task {

    @Id
    private String id;
    private String name;

    private int points;

    private List<Question>questions;

    private List<String>answers;

    ...
}

嵌套问题模型为:

public class Question {
    private Boolean isText = false;
    private String questionText;
}

但是,当作为嵌套 json 发布时,相同的模型会引发 HTTP 400 异常,说 json unreadable 异常,并且它试图将 String questionText 字段解析为布尔值。

这是我发布的内容:

{
  "name" : "Test Task 3",
  "questions": [{ "questionText":"What is the name you college festival?","isText":true}]
}

而出现的例外是:

{
  "timestamp": 1497508476467,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
  "message": "JSON parse error: Can not deserialize value of type boolean from String \"What is the name you college festival?\": only \"true\" or \"false\" recognized; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type boolean from String \"What is the name you college festival?\": only \"true\" or \"false\" recognized\n at [Source: java.io.PushbackInputStream@6a371c03; line: 3, column: 32] (through reference chain: com.frapp.CBM.prod.model.Task[\"questions\"]->java.util.ArrayList[0]->com.frapp.CBM.prod.model.Question[\"questionText\"])",
  "path": "/campaigns/addTask"
}

感谢任何帮助。我已经尝试了几个小时。先感谢您。

【问题讨论】:

  • 你尝试重建吗?
  • 是的。我从构建菜单进行了重建。我也做了两次 gradle 运行。
  • 从解析错误看来,它似乎期待 questionText 的布尔值。请检查服务器代码中 questionText 的数据类型。
  • 我觉得你的questionText setter 参数是Boolean 类型(复制粘贴错误?)
  • 我要对我的任何开发人员做的第一条评论是:请您重命名您的布尔值。这是因为 getter 看起来像:isIsText()。作为一般规则,最好避免以“get”、“set”或“is”开头的字段名称。

标签: java json spring mongodb spring-mvc


【解决方案1】:

我要对我的任何开发人员发表的第一条评论是:请您重命名您的boolean。这是因为 getter 看起来像:isIsText()

作为一般规则,最好避免以“get”、“set”或“is”开头的字段名称。

这是因为这些是 java-beans 属性的前缀。

【讨论】:

    【解决方案2】:
      @RequestMapping(value = "/campaigns/addTask", method = RequestMethod.POST)
        public Campaign addTaskToCampaign(@RequestParam Map<String,Object> campaignName,@Valid @RequestBody Task task){
    
         /* 
          if there is exception then just remove Task put it into json to catch into map.        
          access just as map by campaignName.get("key_name");
         */
    
            Campaign campaign = campaignInterface.findByName(campaignName);
            if (campaign!=null){
                List<String> task_ids;
                if (campaign.getTask_ids()==null){
                    task_ids = new ArrayList<>();
                }else{
                    task_ids= campaign.getTask_ids();
                }
                Task newTask = taskInterface.save(task);
                task_ids.add(newTask.getId());
                campaign.setTask_ids(task_ids);
                return campaignInterface.save(campaign);
            }
            return null;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-19
      • 2019-08-04
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多