首页 > 解决方案 > Spring MVC 方法不将 JSON 字符串返回到 jQuery ajax 调用 - 第二部分

问题描述

Java 8 / Spring 4 MVC webapp / Maven / jQuery 3.3.1

所以我制作了一个 Spring MVC webapp,它的 index.jsp 使用了 ajax 调用。请注意,我已经将过时的 jQuery 成功和错误换成了现代的 done 和 fail

--- index.jsp 片段 ----

jQuery.fn.serializeObject = function() {
  var arrayData, objectData;
  arrayData = this.serializeArray();
  objectData = {};

  $.each(arrayData, function() {
    var value;

    if (this.value != null) {
      value = this.value;
    } else {
      value = '';
    }

    if (objectData[this.name] != null) {
      if (!objectData[this.name].push) {
        objectData[this.name] = [objectData[this.name]];
      }

      objectData[this.name].push(value);
    } else {
      objectData[this.name] = value;
    }
  });

  return objectData;
};

function popupRuleDeck_update_submit() {
    var formJsonObj = $('#form_popupRuleDeck_update').serializeObject();
    var formJsonStr = JSON.stringify( formJsonObj);
    $.ajax({
      url: '${pageContext.request.contextPath}/ruleDeck_update',
      type: "post",
      dataType: "json",
      contentType: "application/json; charset=utf-8",
      data: formJsonStr
    }).done( function(response, message, xhr) {
        console.log("done entered")
        console.dir( response);
        var selectedRow = $('#ruleDeckTable > tbody > tr.selected')
        var selectedData = selectedRow.data();
        console.log( "selectedRowData: " + selectedRowData);
        console.log( "response.data: " + response.data() );
        $('#ruleDeckTable').row( selectedRow).data( response).draw();
        console.log("done exited")
    }).fail( function( xhr, status, response) {
        console.dir( "failed status:" + status);
        console.dir( "failed response:" + response);
        var returnedStr = JSON.stringify( response);
        $.each( response, function( key, val) {
            console.log("---" + key + ":" + val);
        });
        console.dir( "failed returnedStr:" + returnedStr);
        alert( "ruleDeck insert/update error: " + response)
      return false;
    });
}

到我的控制器中使用@Controller NOT @RestController注释的方法

@RequestMapping( value="/ruleDeck_update", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody RuleDeck ruleDeckUpdateUpdate( @RequestBody RuleDeck formRuleDeck)
{
    logger.info("entering ruleDeckUpdateUpdate");

    RuleDeck ruleDeck = null;

    try {
        ruleDeck = tryThisService.findOneRuleDeck( formRuleDeck.getId());
        ruleDeck.setRuleDeckId( formRuleDeck.getRuleDeckId());
        ruleDeck.setRevision( formRuleDeck.getRevision());
        ruleDeck.setName( formRuleDeck.getName());
        ruleDeck.setDeckType( formRuleDeck.getDeckType());
        ruleDeck.setFileLocation( formRuleDeck.getFileLocation());
        ruleDeck = tryThisService.updateOneRuleDeck( ruleDeck);
    } catch (JsonProcessingException e) {
        // TODO Auto-generated catch block
        ruleDeck.setName( "JPE:" + e.getMessage());
    } catch ( Exception e) {
        ruleDeck.setName( "Exception:" + e.getMessage());
    }

    logger.info("exiting  ruleDeckUpdateUpdate");
    return ruleDeck;  //should be implicitly converted into json format and sent back to the request.
}     

和以前一样,ajax 调用将 JSON 发送到该方法,该方法确实找到并更新一个现有对象,该对象保存在数据库中,到目前为止一切顺利。该方法执行没有错误。但现在 .fail() 被调用,我在浏览器控制台中看到以下内容

failed status: error
failed response:
failed returnedStr:

这似乎都表明我的 java 方法末尾的“return ruleDeck”语句实际上没有返回任何内容,或者可能是一个空字符串。我难住了。根据这里的帖子,我希望响应是一个 JSON 对象

或者也许更好的方法是返回一个 ResponseEntity(ruleDeck, HttpStatus.OK) 。但是,我将如何在浏览器领域读到它呢?

请帮忙!

TIA,

code_warrior

标签: jqueryajaxspring

解决方案


推荐阅读