【问题标题】:Why isn't my form data getting to my @RequestBody为什么我的表单数据没有到达我的@RequestBody
【发布时间】:2019-01-25 23:44:41
【问题描述】:

我正在使用 Spring。我有一个控制器,它为用户创建一个页面,然后用户输入数据。我需要捕获该数据并放入数据库 我的控制器

@Controller
@RequestMapping({"/pdc"})
public class PDCController {
    // generate page to send to user
    @RequestMapping(value = {"/{ffaAssgnId}"}, method = RequestMethod.GET)
    public String getAssignment(Model model, @PathVariable Integer ffaAssgnId) {
        Integer userContactId = userService.getUserContactId();

        PDCAssgn assignment = pdcService.getAssgn(ffaAssgnId, userContactId);

        List<MagValidate> statuses = validateService.getValidateByType("FAS");
        Map<Integer, MagValidate> mapStatuses = new HashMap<>();
        for (MagValidate status : statuses) {
            mapStatuses.put(status.getValidateId(), status);
        }

        model.addAttribute("mapStatus", mapStatuses);
        model.addAttribute("assignment", assignment);

        return "pdc";
    }
    // get response from user
    @RequestMapping(value = {""}, method = RequestMethod.POST)
    public @ResponseBody AjaxResponse updateAssignment(@RequestBody PDCAssgn assignment) {
        System.out.println(assignment.toString());

//      try {
//          pdcService.updateAssgn(assignment);
//      } catch (Exception ex) {
//          ex.printStackTrace();
//          List<String> errors = new ArrayList<>();
//          errors.add("Error saving DARF.");
//          return new AjaxResponse("ERROR", null, errors);
//      }

        return new AjaxResponse("OK", null, null);
    }
}

我渲染表单的一部分

    <td><input id="wholesalerIssues0.assgnIssue.promoDealers" name="wholesalerIssues[0].assgnIssue.promoDealers" class="numberLarge" type="text" value=""/></td>
    <td><input id="wholesalerIssues0.assgnIssue.dealersFound" name="wholesalerIssues[0].assgnIssue.dealersFound" class="numberLarge" type="text" value=""/></td>
    <td><input id="wholesalerIssues0.assgnIssue.curDraw" name="wholesalerIssues[0].assgnIssue.curDraw" class="numberLarge" type="text" value=""/></td>
    <td><input id="wholesalerIssues1.assgnIssue.promoDealers" name="wholesalerIssues[1].assgnIssue.promoDealers" class="numberLarge" type="text" value=""/></td>
    <td><input id="wholesalerIssues1.assgnIssue.dealersFound" name="wholesalerIssues[1].assgnIssue.dealersFound" class="numberLarge" type="text" value=""/></td>
    <td><input id="wholesalerIssues1.assgnIssue.curDraw" name="wholesalerIssues[1].assgnIssue.curDraw" class="numberLarge" type="text" value=""/></td>

等价的jsp

    <td><form:input  path="wholesalerIssues[${whStatus.index}].assgnIssue.promoDealers" cssClass="numberLarge" placeholder="${targetTitle.promoDealers}"/></td>
    <td><form:input  path="wholesalerIssues[${whStatus.index}].assgnIssue.dealersFound" cssClass="numberLarge" placeholder="${targetTitle.dealersFound}"/></td>
    <td><form:input  path="wholesalerIssues[${whStatus.index}].assgnIssue.curDraw" cssClass="numberLarge" placeholder="${targetTitle.curDraw}"/></td>

发送数据的javascript

function doSendA(e) {
e.preventDefault();

var form = $("#frm-assignment");
var formFields = $("#frm-assignment input:not([readonly])")
var formData = {}
$.each(formFields, function(i, v){
    var input = $(v);
    // populate form data as key-value pairs
    // with the name of input as key and its value as value
    formData[input.attr("name")] = input.val();
});
console.log(formData);
$.ajax({
    type: "POST",
    url: "${pageContext.request.contextPath}/pdc",
    contentType: "application/json; charset=utf-8" ,
    data: JSON.stringify(formData),
    dataType: "json",
    success : function(ajaxResponse) {
        if (ajaxResponse.status !== "OK") {
            hideLoading();
            showToast("bad", ajaxResponse.errors[0]);
            return;
        }
        hideLoading();
//              location.reload();
            showToast("good", "Your data was saved.");
    },
    error : function(res) {
        hideLoading();
        showToast("bad", "There was a problem saving your data.");
    }
});
}

console.log(formData);

{"wholesalerIssues[0].assgnIssue.promoDealers":"123","wholesalerIssues[0].assgnIssue.dealersFound":"","wholesalerIssues[0].assgnIssue.curDraw":"","wholesalerIssues[1].assgnIssue.promoDealers":"","wholesalerIssues[1].assgnIssue.dealersFound":"","wholesalerIssues[1].assgnIssue.curDraw":""}

控制器的System.out.println(assignment.toString());

magforce.model.PDCAssgn@4f71f251[wholesalerIssues=<null>]

我尝试打印出请求中的内容,发现绑定期间没有错误,但我的结果数据对象仍然是空的。我做了很多谷歌查询,但还没有找到任何使用 Spring 的表单标签(&lt;form:form&gt;&lt;form:input&gt; 等)加上 ajax json 和 Spring 的 @RequestBody 的东西。

【问题讨论】:

  • 您是否尝试过使用 curl 或 Postman 或类似工具访问您的端点?
  • @JonckvanderKogel 不。我不确定我会怎么做。目前我认为它与组装formData 的代码有关。我目前正在开发一个构建 javascript 对象的函数。

标签: javascript java json spring spring-mvc


【解决方案1】:

不是一个真正的答案,而是把它放在这里作为我评论的扩展。这里的目标是向您展示如何测试您的端点。

您的控制器正在公开一个端点。如果您启动您的应用程序,您有一个可以访问的 URL,在本例中为“http://localhost:8080/pdc”(除非您为 URL 添加前缀,但根据您发布的内容,这应该是您的 URL)。如果您在 *NIX 系统上,您可以使用 curl。如果您使用的是 Windows,您可能想尝试一下 Postman。要在您的 POST 端点上使用 curl,对您的端点的调用将是这样的。当然我不知道你的对象结构,所以一定要根据你的对象结构调整JSON。

curl -i -H "Accept: application/json" -H "Content-Type: application/json" \
          -X POST -d \
       '{
           "yourObject":{
              "someArray":[
                 {
                     "aDate":{
                        "year":2019,
                        "month":10,
                        "day":1
                     },
                    "someValue":4,
                    "otherVaule":10000,
                    "anId":1
                 }
              ],
              "someOtherValue":100000,
              "someStatus":"DRAFT"
           }
        }' http://localhost:8080/pdc

通过使用这样的工具测试您的端点,您可以隔离您遇到的问题。一旦你成功地校准了你的端点,你至少会知道你的端点是有序的,并且任何问题都出在你的 JavaScript 代码中。

【讨论】:

  • 我已经启动并运行了 Postman,我尝试使用 json 对象调用端点,但我得到了一个丢失的 CSRF 令牌。我尝试在刚刚加载的页面中复制令牌,但系统说它无效,我认为这是令牌的重点。我不确定如何绕过令牌。
  • 啊,你越来越近了。您需要 CSRF 令牌这一事实可能也是您从 JavaScript 调用失败的原因。你碰巧启用了 Spring Security 吗?
  • 是的。当用户尝试访问系统中的任何内容时,我们有一个登录页面。我可能需要解决这个问题,所以我需要一个会话 ID。
  • 是的,是 Spring Security 在这里阻止了您。您还需要将 CSRF 令牌添加到您的请求中。这是一个结合 Spring Security 开始 CSRF 主题的好页面:baeldung.com/spring-security-csrf
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多