使用Jackson Framework

时间:2017-08-14 10:16:42

标签: java jquery ajax spring spring-mvc

Hy guys。

我有一些数据,由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错误。

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

Object response

参数似乎正确:

Object Parameters

我在Java控制台上没有错误;

所以,我不明白的是,如果我错误地使用Object Mapper配置,或者取决于我在控制器或其他设备上实现的内容。

2 个答案:

答案 0 :(得分:1)

您正在使用@RequestBody表示您的控制器需要有效负载,因此您需要在发送之前使用JSON.stringify序列化您的JavaScript对象,否则它将以enl形式发送。

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

此外,您的请求映射看起来不对。您将使用ModelAndView返回@ResponseBody。它们不应该一起使用,并且没有意义返回ModelAndView到ajax请求。

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

@PostMapping(value="/todaydatarecover")

答案 1 :(得分: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网址。