当前位置: 首页 > 面试题库 >

Spring @Requestbody没有映射到内部类

国晟睿
2023-03-14
问题内容

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

这有效:

Controller.java

@PostMapping("newTransaction")
TransactionRequestModel insertNewTransaction(@RequestBody TransactionRequestModel model){
    //do something
}

TransactionRequestModel.java

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

KeyValue.java

public class KeyValue {

    String key;
    String value;
    //default constructor
    //setter-getter
}

请求正文

{
  "id": 1 
  "keyValueList": [
    {
      "key": "dummy",
      "value": "dummy"
    }
  ]
}

使用杰克逊的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 
}

意味着,将 KeyValue设置内部类 ,会出现以下错误。

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

为什么?

SO中的所有相关文章都提到了第一种情况。我想知道为什么这行不通。请帮忙。


问题答案:

你必须使自己的内在阶级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 
}


 类似资料:
  • 问题内容: 我无法使Spring MVC解决.html视图文件。 我具有以下视图文件夹结构: 我有一个简单的hello world控制器方法,该方法只显示一条消息并返回视图名称“ home”。我有一个home.jsp文件,但想改用home.html。 当我击中spaceships/home时,控制器会打印出“ hello world”消息,并且我看到home.jsp视图没有问题。 问题是当我将后缀

  • 生成的对象不能是对象的,而是任何类型的,它包含与示例相同的值--只是转换为number。 我必须指定我自己的Jackson反序列化器吗(我怎么做?)对于这个问题,还是改变构造函数就足够了?

  • 问题内容: 在我的applicationContext.xml中,这就是将xml映射到POJO的方式。如何将目录映射到类文件而无需创建xml? 问题答案: 您可以通过转换进一步简化操作 至 现在您的包中所有带有注释的类都将自动被拾取。

  • POJO类: 控制器: JSON请求: 问题: 当我处理请求时,我收到一个空的TransactionDto对象。 System.out.println(transactionDto) TransactionDto(id=null,userName=null,apiKey=null,amount=0,accountNumber=null,expirationDate=null,cscCode=nul

  • 问题内容: 我正在尝试为作为JSON传入的对象创建内部类类型,但是尽管我在此处以及杰克逊的网站上都读了很多文章,但我似乎无法获得正确的组合,因此,如果其他人有任何指针,他们将不胜感激。我在下面发布了一些代码片段,并删除了所有的getter和setter,但我不认为他们需要发布。我正在使用Jackson 2.2。 我正在尝试反序列化的类: 我用来反序列化的代码: 我的JSON测试数据: 问题答案:

  • 我是spring+MVC的新手。我找到了一个脚本,我可以运行这个脚本的一部分。这个脚本配置spring mvc没有xml,在Java方面.我将所有的jar放入web-inf/lib。 控制器配置.Java WebAppInitializer.java HomeController.java FilmController.java film.java 我有两个问题: 如果我写“http://loca

  • 我正在尝试使用spring MVC。我的问题是,在我的控制器中没有请求映射工作,只有我的主页链接:“/”工作。 我的web.xml文件是: 2019年5月9日下午4:55:42 org.springframework.web.servlet.dispatcherservlet noHandlerFound警告:GET/springmvc/showform没有映射

  • 卡桑德拉表列: Java实体: 当执行从表列“pickuploc”中选择查询时,并没有完全映射到实体中定义的picupLocal属性。 这是我得到的回应: 使用Spring数据卡桑德拉1.5.8