【问题标题】:Spring MVC - Return view with Ajax using POST and sending dataSpring MVC - 使用 POST 和发送数据的 Ajax 返回视图
【发布时间】:2023-04-09 05:08:01
【问题描述】:

我正在尝试开发一个简单的组件,该组件的工作是使用模板呈现数据的特定部分。

我正在使用 Spring-Data-Rest-MVC,因此我有一个现成且可工作的 OOTB 数据源,适合我的要求(基于 AJAX 的 Web 应用程序)。

所以,我有什么问题。 问题出在这里:

{
  "panels":[
    {
      "id":"panel-BASIC",
      "el":"panel-BASIC",
      "attributes":[
        {
          "position":"0",
          "key":"id",
          "display":"value",
          "dataUtility":"",
          "value":"2"
        },
        {
          "position":"1",
          "key":"begin",
          "display":"value",
          "dataUtility":"",
          "value":1384518600000
        },
        {
          "position":"2",
          "key":"end",
          "display":"value",
          "dataUtility":"",
          "value":1384518600000
        },
        {
          "position":"3",
          "key":"interval",
          "display":"value",
          "dataUtility":"intervalCalculationDataUtility"
        }
      ]
    },
    {
      "id":"panel-ONE_TO_MANY",
      "el":"panel-ONE_TO_MANY",
      "attributes":[
        {
          "position":"0",
          "key":"tasks",
          "display":"table",
          "dataUtility":"",
          "value":"http://localhost:8080/rest/appointment/2/tasks"
        }
      ]
    },
    {
      "id":"panel-MANY_TO_ONE",
      "el":"panel-MANY_TO_ONE",
      "attributes":[
        {
          "position":"0",
          "key":"car",
          "display":"infopage",
          "dataUtility":"",
          "value":"http://localhost:8080/rest/appointment/2/car"
        },
        {
          "position":"1",
          "key":"assignee",
          "display":"infopage",
          "dataUtility":"",
          "value":"http://localhost:8080/rest/appointment/2/assignee"
        },
        {
          "position":"2",
          "key":"reporter",
          "display":"infopage",
          "dataUtility":"",
          "value":"http://localhost:8080/rest/appointment/2/reporter"
        }
      ]
    }
  ],
  "container":"ip-SAppointment"
}

这是发送到服务器的描述符,之前使用检索到的数据和模板描述符在客户端构建。

使用我发布的 JSON,我需要发送一个 POST 请求,然后返回渲染视图。 控制器方法的工作相当简单:

@RequestMapping(
        value = "/template/render",
        method = RequestMethod.POST,
        produces = MediaType.TEXT_PLAIN_VALUE,
        consumes = MediaType.APPLICATION_JSON_VALUE
)
public ModelAndView getInfoPageViewData(
        @RequestBody final InfoPageDescriptor body
) {
    LOGGER.trace(String.format("/getInfoPageViewData -> %s", body));
    final ModelMap modelMap = new ModelMap();
    modelMap.put("dd", body);
    return new ModelAndView(DATA_VIEW_NAME, modelMap);
}

如您所见,它将发送的 JSON 包装到 InfoPageDescriptor bean 中,该 bean 放置在 ModelMap 中。

返回的视图将处理模型映射中的 bean,并根据条目采取相应的行动。

无论如何我都可以让这个方法奏效。使用这样的 jQuery (AJAX-POST) 调用:

function loadRenderedView(url, data, callback) {
    return $.ajax({
        headers : {
            'Accept'      : 'text/plain',
            'Content-Type': 'application/json'
        },
        url     : url,
        data    : JSON.stringify(data),
        dataType: 'json',
        type    : 'post',
        success : function (data) {
            callback.apply(this, [data, true]);
        },
        failure : function () {
            callback.apply(this, [data, false]);
        }
    });
}

我收到一个错误:客户端发送的请求在语法上不正确。

您能否提供一些关于我应该如何构建请求或控制器-服务器方法以使其工作的提示?

【问题讨论】:

  • 将 "log4j.logger.org.springframework = INFO, yourlogger" 添加到您的 log4j.properties 并检查跟踪,看来您发送的 Json 与 InfoPageDescriptor 类不匹配。
  • 好的,我去看看。
  • 你拯救了我的一天,这个小技巧让我发现了一个错误。事实上,我的 JSON 结构与 Java 结构不匹配。一个小的嵌套属性有不同的名称。感谢您的帮助;)

标签: ajax spring-mvc model-view-controller view


【解决方案1】:

好的,将其作为答案发布,因为我需要在这里设置格式。

@vzamanillo,您的假设在这里可能是正确的,因为我检查了日志并发现了这些异常:

2013-12-14 17:15:14 DEBUG ExceptionHandlerExceptionResolver:132 - Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotSupportedException: Invalid media type "json": does not contain '/'
2013-12-14 17:15:14 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotSupportedException: Invalid media type "json": does not contain '/'
2013-12-14 17:15:14 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotSupportedException: Invalid media type "json": does not contain '/'

我认为这可能与以 JSON 格式发送的 URL 有关,因此我将对此进行调查。

【讨论】:

    【解决方案2】:

    添加

    Log4j.logger.org.springframework = INFO,你的记录器

    到您的 log4j.properties 并检查跟踪,看来您发送的 Json 与 InfoPageDescriptor 类不匹配。

    编辑:

    将 stringify 的 dataType 更改为“application/json” 它可能会解决问题并将 ajax 请求的 Accept 标头更改为

    '接受':'应用程序/json',

    【讨论】:

    • 嗯,这可能是问题......无论如何它现在已经修复,我能够检索 json 并将 bean 包含在视图中以根据模板和数据呈现它.
    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 2013-09-06
    • 2020-03-26
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    相关资源
    最近更新 更多