IllegalStateException:需要一个字符串,但在第 1 行第 2 列路径 $ 处 BEGIN_OBJECT;嵌套异常是 com.google.gson.JsonSyntaxException

IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $; nested exception is com.google.gson.JsonSyntaxException

我正在 SpringBoot 中执行 post 请求并使用 postman 对其进行测试,但是当我在 Postman 中传递 body 并尝试读取时在我的应用程序中,它会抛出错误。
这是Spring中的方法:

@PostMapping(path=PathConstants.START_ACTION)
    public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) String params){

if(params!=null) {
                Gson gson = new Gson();
                Map<String,Object> pvar = gson.fromJson(params, Map.class);
                System.out.println(pvar);           
            } 
}

在 Postman 中,我以这种方式传递参数:

我在header中指定content-type为application/json
但是,如果我使用“Param”选项卡传递我的参数

有效。但我需要将它们作为 body 而不是参数传递。哪里出了问题?

Method 1 :

Header Content-Typeapplication-json。所以 Spring 尝试将你的 json 构造成 LinkedHashMap.

现在,试试这个...

@PostMapping(path=PathConstants.START_ACTION)
    public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) Map<String, Object> bodyObject){

if(MapUtils.isNotEmpty(bodyObject)) {
              Map<String,Object> pvar = bodyObject;
}

而不是

@PostMapping(path=PathConstants.START_ACTION)
    public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) String params){

if(params!=null) {
                Gson gson = new Gson();
                Map<String,Object> pvar = gson.fromJson(params, Map.class);
                System.out.println(pvar);           
            } 
}

并将 header 传递给 content-type 作为 application/json。这会起作用..

Method 2 ::

现在,如果您还想像这样使用自己的旧签名方法..

 @PostMapping(path=PathConstants.START_ACTION)
        public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) String params){}

然后在 headercontent-typetext/plain。那么您的旧方法也可以使用..