【问题标题】:Spring Boot ObjectMapper for @RequestBody annotation using Jackson Framework使用 Jackson 框架进行 @RequestBody 注释的 Spring Boot ObjectMapper
【发布时间】:2017-08-14 10:16:42
【问题描述】:

大家好。

我有一些数据,由 jQuery DataTable 给出,我使用 Ajax 和数据元素发送到 Spring Controller。更具体地说,ajax函数片段是:

$.ajax({
                        url: "../todaydatarecover.json",
                        type: "post",
                        data: dataToSend,

正如我在 Stack 上的另一篇文章中解释的那样,我在控制器中使用了(导致存在“数据”)RequestBody 注释:

@PostMapping(value="/todaydatarecover.json")


@ResponseBody
    public ModelAndView todayInfoAndIdRecover(ModelAndView model, HttpServletRequest request,
            @RequestBody TodayData todayData) throws IOException
    {   

并且,正如我所解释的那样,我创建了一个类,其中包含由 ajax 发送到控制器的变量;在方法标志中,您可以看到她的名字是 TodayData。这是实现:

public class TodayData 
{
    private long dateInBox;
    private String nameInBox;
    private String typeInBox;

<follow setters and getters>

在网上搜索,我发现可能需要明确设置对象映射器;所以,我找到了我的配置(Spring Boot 和 Jackson Framework,都在上一个版本)这个:

@Bean
     public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
      MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
      ObjectMapper objectMapper = new ObjectMapper();
      objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
      jsonConverter.setObjectMapper(objectMapper);
      return jsonConverter;
     }

放在public class MvcConfiguration extends WebMvcConfigurerAdapter 文件中。

数据作为对象传递给Controller:

$('#eventsdatageneral').on('click', '.btn.btn-info', function(event) 
            {
                var today_date = new Date().getTime(); 
                var dataToSend = new Object();
                dataToSend.dateInBox= today_date;
                dataToSend.nameInBox = host_name;
                dataToSend.typeInBox = type_name;

问题是当我点击必须启用发送的按钮时,我收到了 404 错误。

对象的格式似乎很好;在控制台上,我得到了这个:

而且参数似乎是正确的:

Java 控制台没有错误;

所以,我不明白是我错误的对象映射器配置还是取决于我在控制器或其他设备上实现的内容。

【问题讨论】:

  • 使用 PostMapping 注解,您不需要指定 @ResponseBody 到方法。此外,您必须返回 POJO 对象而不是 ModelAndView 来回写以响应您的 REST 服务。您还可以从 PostMapping 中删除 .json。

标签: java jquery ajax spring spring-mvc


【解决方案1】:

您需要对代码进行一些更改

  1. 您需要创建如下 JSON 对象,以便将其与您的 Java POJO 类TodayData 绑定:

    $('#eventsdatageneral').on('click', '.btn.btn-info', function(event) { var today_date = new Date().getTime(); var dataToSend = {}; dataToSend["dateInBox"] = today_date; dataToSend["nameInBox"] = host_name; dataToSend["typeInBox"] = type_name;

  2. 在发送您的 ajax 请求时,您需要使用 JSON.stringify 函数,它将您的 javascript 对象转换为 JSON。

    $.ajax({ url: "../todaydatarecover.json", type: "post", data: JSON.stringify(dataToSend),

  3. 正如 alfcope 提到的,ModelAndView@ResponseBody 不应该一起使用,因为当我们在一个方法上使用 @ResponseBody 时,我们说我们不希望生成一个视图,并且该对象将作为响应正文的一部分返回。

  4. 检查您为此应用程序所做的配置中的url-pattern,或者更正您发送为.json 的网址。

【讨论】:

  • 感谢@RahulO。您的回复使我的代码正常工作。非常感谢。
【解决方案2】:

您正在使用@RequestBody,这意味着您的控制器需要一个有效负载,因此您需要在发送之前使用JSON.stringify 序列化您的 JavaScript 对象,否则它将以 url 格式发送。

$.ajax({
  url: "../todaydatarecover.json",
  type: "post",
  data: JSON.stringify(dataToSend),
  ...
});

另外,您的请求映射看起来有误。您正在返回 ModelAndView,但使用 @ResponseBody。它们不应一起使用,并且将 ModelAndView 返回到 ajax 请求是没有意义的。

我建议您从请求映射中删除扩展名 (.json)。它应该只是:

@PostMapping(value="/todaydatarecover")

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2019-02-05
    • 2015-10-19
    • 2017-10-29
    相关资源
    最近更新 更多