【问题标题】:Spring controller not getting JSON POST data from JS fileSpring 控制器没有从 JS 文件中获取 JSON POST 数据
【发布时间】:2013-07-25 23:11:50
【问题描述】:

从我的 JS 文件中,我发布了这个 JSON 数据。

myPayload[0].id=1&myPayload[0].name=Me&myPayload[0].pId=2&myPayload[0].pName=Dad

YUI 代码:

var formElements = YAHOO.util.Connect.setForm("myFormId");
alert("New form elements:" + formElements); // Alerting POST data as shown above

YAHOO.util.Connect.resetFormState();

YAHOO.util.Connect.asyncRequest("POST", "/mycontroller/save", {
    cache : false,
    success : function(res) {
        alert(res.responseText);
    },
    failure : function(res) {
        alert(res.responseText);
    }
}, formElements);

控制器代码:

@RequestMapping(value = "/save", method=RequestMethod.POST)
@ResponseBody
public String saveData(ModelMap mm, @ModelAttribute("myPayload") MyBean bean,  BindingResult errors) {

    log.info("save:Called");
    List<MyDTO> lst = bean.getList();
    log.info("save:Number of records:" + lst.size());

    return "Successfully Updated.";
}

豆码:

public class MyBean {

    private List<MyDTO> myPayload = new  AutoPopulatingList<MyDTO>(MyDTO.class);

    public List<MyDTO> getList() {
        return myPayload;
    }

    public void setList(List<MyDTO> mList) {
        this.myPayload = mList;
    }

}

列表仍然是空的。 bean 值也是空的。 我在这里做错了什么?

【问题讨论】:

  • 您是否在表单中将命令名称指定为“myPayload”?
  • 是的,在我的格式化程序中创建元素时,我以这种方式提供了 id。例如。 id:“myPayload[”+索引+“]。” + oColumn.getKey()。我从 JS 文件中的 setForm API 调用获取有效负载。我在我的问题中提到了这一点。在发送请求之前,我在 JS 中正确获取了所有 id:value 映射。但是在控制器中没有得到那些。有效载荷在传输过程中丢失。

标签: json spring-mvc


【解决方案1】:

嗯...这行得通吗?

以类似的形式添加modelAttribute="contactForm"

< form:form method="post" action="your url" modelAttribute="myPayload" >

或使用@RequestBody:

@RequestMapping(value = "/save", method=RequestMethod.POST)
@ResponseBody
public String saveData(ModelMap mm, @RequestBody MyBean bean,  BindingResult errors) {

顺便问一下,yui(我对js不熟悉)可以把myPayload[0].id=1&amp;myPayload[0].name=Me&amp;myPayload[0].pId=2&amp;myPayload[0].pName=Dad转成JSON吗?毕竟不像普通的 JSON。

更新

@ModelAttribute解决方案: 将所有myPayload[x].foo=bar更改为list[x].foo=bar(如果list是MyBean中的字段名)并在form标签中保留modelAttribute="myPayload"。

@RequestBody解决方案:

如果使用@RequestBody,则添加jackson依赖

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.12</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.12</version>
</dependency>

【讨论】:

  • 1. modelAttribute 不起作用 2. @RequestBody 抛出了一些奇怪的 jackson baseclass not found 异常。
  • @Sujoy 在 YUI 中“myPayload[0].id=1”字符串是否等于 ?我不熟悉这个框架?并查看 RequestBody 问题的答案更新。
  • 是的,完全一样。对于 RequestBody 问题,那个 jackson jar 已经存在于类路径中,它正在为同一项目的其他控制器工作。仅对于此控制器不是。这很奇怪。
  • 您能发布 RequestBody 错误堆栈并检查我的 ModelAttribute 解决方案更新吗?
  • 我在 HttpRequest 中获取所有数据。 “@RequestBody”不起作用,因为我使用的是列表,并且在 Spring MVC 中它无法转换为具有 AutoPopulatingList 的 bean 的“@ModelAttribute”以外的 AutoPopulatingList。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多