将 JSON Map 传递到 Spring MVC 控制器

2024-05-24

我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中。

@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@RequestParam("filters") HashMap<String,String> filters, HttpServletRequest request) {
       //do stuff
}

我发现 @RequestParam 只会抛出 500 错误,所以我尝试使用 @ModelAttribute 代替。

@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@ModelAttribute("filters") HashMap<String,String> filters, HttpServletRequest request) {
       //do stuff
}

这将正确响应请求,但我意识到地图是空的。通过后来的实验,我发现任何对象(不仅仅是 HashMap)都会被实例化,但不会填充任何字段。我的类路径上确实有 Jackson,并且我的控制器将使用 JSON 进行响应。但是,我当前的配置似乎不允许 Spring 通过 GET/POST 参数读取 JSON。

如何将对象的 JSON 表示作为请求参数从客户端 AJAX 请求传递到 Spring 控制器并获取 Java 对象?

EDIT添加我的相关Spring配置

  <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
      <map>
        <entry key="html" value="text/html" />
        <entry key="json" value="application/json" />
      </map>
    </property>
    <property name="viewResolvers">
      <list>
        <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
          <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
          <property name="prefix" value="/WEB-INF/jsp/" />
          <property name="suffix" value=".jsp" />
        </bean>
      </list>
    </property>
    <property name="defaultViews">
      <list>
        <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
          <property name="prefixJson" value="true" />
        </bean>
      </list>
    </property>
  </bean>
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
      <list>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
      </list>
    </property>
  </bean>

根据评论者的建议,我尝试了@RequestBody。只要 JSON 字符串用引号引起来,这就会起作用双引号.

@RequestMapping(value = "/search.do", method = RequestMethod.POST, consumes = { "application/json" })
public @ResponseBody Results<T> search(@RequestBody HashMap<String,String> filters, HttpServletRequest request) {
      //do stuff
}

这确实解决了我眼前的问题,但我仍然很好奇如何通过 AJAX 调用传入多个 JSON 对象。


这确实解决了我眼前的问题,但我仍然很好奇如何通过 AJAX 调用传入多个 JSON 对象。

执行此操作的最佳方法是拥有一个包含要传递的两个(或多个)对象的包装对象。然后,您将 JSON 对象构造为两个对象的数组,即

[
  {
    "name" : "object1",
    "prop1" : "foo",
    "prop2" : "bar"
  },
  {
    "name" : "object2",
    "prop1" : "hello",
    "prop2" : "world"
  }
]

然后,在控制器方法中,您将请求正文作为单个对象接收,并提取两个包含的对象。是:

@RequestMapping(value="/handlePost", method = RequestMethod.POST, 
                consumes = {      "application/json" })
public void doPost(@RequestBody WrapperObject wrapperObj) { 
     Object obj1 = wrapperObj.getObj1;
     Object obj2 = wrapperObj.getObj2;

     //Do what you want with the objects...


}

包装对象看起来像......

public class WrapperObject {    
private Object obj1;
private Object obj2;

public Object getObj1() {
    return obj1;
}
public void setObj1(Object obj1) {
    this.obj1 = obj1;
}
public Object getObj2() {
    return obj2;
}
public void setObj2(Object obj2) {
    this.obj2 = obj2;
}   

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JSON Map 传递到 Spring MVC 控制器 的相关文章

随机推荐

  • 有什么办法可以自动生成UML图吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 MySQL 数据库 我想生成它的关系图 有没有一个工具可以连接到数据库并自动为我生成它 是的
  • iOS Javascript DOM“冻结?”

    这里有几个问题 有没有办法阻止 iOS 在滚动时冻结页面上的 javascript 当您在另一个选项卡中或切换应用程序时 iOS 是否会冻结 JavaScript iOS 上还有其他主要的 javascript 限制吗 iOS 6 x 会暂
  • 如何将“npm install”集成到 ASP.NET CORE 2.1 Docker 构建中

    我还没有找到一种方法来构建 ASP NET Core 2 1 Docker 映像 同时执行正确的操作npm install在构建过程中 My Dockerfile看起来像这样 从 Visual Studio 生成的 FROM microso
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 C# 执行 Powershell commandlet 时出错

    我有以下经过测试且有效的代码 using new Impersonator Administrator dev dev RunspaceConfiguration runspaceConfiguration RunspaceConfigur
  • 为什么我的圈子值为零?

    这是我的 Circle 类代码 class Circle private double radius private double area public Circle double radius this radius radius pu
  • 静态构造函数中的 Database.SetInitializer() ?

    许多人可能知道为什么我们需要使用下面所示的代码 但是 我想将此逻辑分成几层 并且不想在 Web 层中引用实体框架 DLL 因此我最终将此代码放入我的静态构造函数中DbContext class 这是一个坏主意吗 这样做会对应用程序的性能造成
  • Firebase HTTP Cloud Functions - 读取数据库一次

    我有 Firebase HTTPs 功能 该函数需要根据查询参数从 Firebase 数据库读取值 并根据该数据返回结果 Firebase JS SDK 表示要使用以下命令来执行此操作 return firebase database re
  • Opencv 2.4.2 代码讲解-人脸识别

    我参考OpenCV提供的文档制作了一个人脸识别程序 可以识别多个人脸 并且工作正常 在文档中 他们制作了省略号来突出显示脸部 我不明白的是他们如何计算椭圆的中心 他们的计算如下 for int i 0 i lt faces size i P
  • 如何在 dbus-send 中使用变体字典 (`a{sv}`)

    我有一些麻烦dbus send使用时a sv 调用方法in signature a ss 似乎可以使用 以下命令行 dbus send dest org test TestService org test TestService objec
  • MongoDb 中的全局自增字段

    有没有办法在集合中创建全局自动递增的值 Perforce 有一个变更列表的概念 它可以成为无状态更新的强大功能 我正在考虑相同类型的功能 例子 create gt DocA name foo gt changelist 1 create g
  • Highcharts 奇怪的分组行为

    我正在使用延迟加载 http www highcharts com stock demo lazy loading加载 OHLC 数据的方法 在服务器端 我使用 Python MySQL 并有 4 个包含 OHLC 数据的表 时间间隔为 5
  • 使用 C# 使用 INF 文件安装 libusb 驱动程序

    我想在 Windows 安装程序安装过程中安装第三方 libusb 驱动程序 我使用 Visual Studio 2010 创建了此安装 我尝试使用 SetupAPI 和 DifXAPI 通过命令行安装此驱动程序 但没有任何反应 我预计会弹
  • 如何以全屏模式连接Linux CentOS 7虚拟机? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在从 Windows 8 1 从 Hyper V 连接到 CentOS 7 VM 全屏模式不起作用 我需要解决这个问题 其他虚拟机包括
  • Linq 查询可以从 Sql 数据库检索 BLOB 吗?

    Linq 查询可以从 Sql 数据库检索 BLOB 吗 他们是怎么出来的 LINQ To SQL 类为 SQL Server 中的所有二进制和 varbinary 字段创建 System Data Linq Binary 类型的属性 Bin
  • Java 9 中可以使用提前编译吗?

    As per JEP 295 http openjdk java net jeps 295 任何 JDK 模块 类或用户代码的 AOT 编译都是实验性的 JDK 9 中不支持 要使用 AOT 化的 java base 模块 用户必须编译该模
  • Android:当一个服务被杀死时,我们如何保存服务状态以供以后恢复?

    我们创建了一个应用程序 本质上是一个计时器 秒表 具有一些精心设计的功能 我们定义了一个服务 用于计时并提醒订阅某些计时器事件的侦听器 活动等 我们希望能够在 Android 终止我们的服务 用于内存回收 时保存计时器 秒表的状态 经过的秒
  • 如何以编程方式访问打印机的墨水量?

    好的 这是 Windows 特定的问题 我需要能够访问连接到计算机的打印机的墨水量 可能是直接连接 也可能是网络连接 我认识到每个打印机 或至少是打印机公司 的情况可能会有所不同 但我在哪里可以找到有关它们如何向 PC 显示墨水量的信息 另
  • 无效数据的 REST 响应代码

    如果出现以下情况 应将什么响应代码传递给客户端 用户注册时传递了无效数据 例如电子邮件格式错误 用户名 电子邮件已存在 我选择了403 我还发现了以下我觉得可以用的 维基百科 412 前提条件失败 服务器不满足请求者要求的先决条件之一 提出
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j