繁体   English   中英

使用Jackson框架的@RequestBody注释的Spring Boot ObjectMapper

[英]Spring Boot ObjectMapper for @RequestBody annotation using Jackson Framework

大家好

我有一些由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控制台上没有错误;

所以,我不明白的是,如果我错了Object Mapper配置,还是取决于我在控制器或其他控制器上实现的功能。

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

  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形式发送的url。

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

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

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

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

@PostMapping(value="/todaydatarecover")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM