Spring @Requestbody没有映射到内部类

Ram*_*n R 2 spring spring-mvc

我正在使用Spring 4.x进行Spring Rest Api项目

这个作品:

Controller.java

@PostMapping("newTransaction")
TransactionRequestModel insertNewTransaction(@RequestBody TransactionRequestModel model){
    //do something
}
Run Code Online (Sandbox Code Playgroud)

TransactionRequestModel.java

public class TransactionRequestModel {
    private int id;
    private List<KeyValue> keyValueList;
    public TransactionRequestModel(){}
    //default constructor
    //getter-setter 
}
Run Code Online (Sandbox Code Playgroud)

KeyValue.java

public class KeyValue {

    String key;
    String value;
    //default constructor
    //setter-getter
}
Run Code Online (Sandbox Code Playgroud)

请求身体Json

{
  "id": 1 
  "keyValueList": [
    {
      "key": "dummy",
      "value": "dummy"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

使用jackson的Spring消息转换器工作正常.

这不会:

当我将TransactionRequestModel.java更改为以下(并删除KeyValue.java)时

public class TransactionRequestModel {

    public class KeyValue {     
      String key;
      String value;
      //default constructor
      //setter-getter
    }
    private int id;
    private List<KeyValue> keyValueList;
    public TransactionRequestModel(){}
    //default constructor
    //getter-setter 
}
Run Code Online (Sandbox Code Playgroud)

意味着,使KeyValue成为内部类,得到以下错误.

org.springframework.http.converter.HttpMessageNotReadableException:无法读取文档:找不到类型[simple type,class com.example.model.TransactionRequestModel $ KeyValue]的合适构造函数:无法从JSON对象实例化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?)

为什么?

SO中的所有相关帖子都提到了第一个场景.我想知道为什么这不起作用.请帮忙.

Str*_*lok 6

你必须做你的内心阶级static.

public class TransactionRequestModel {

  public static class KeyValue {     
    String key;
    String value;
    //default constructor
    //setter-getter
  }
  private int id;
  private List<KeyValue> keyValueList;
  public TransactionRequestModel(){}
  //default constructor
  //getter-setter 
}
Run Code Online (Sandbox Code Playgroud)