将javascript对象数组作为参数发送到控制器

将javascript对象数组作为参数发送到控制器,java,javascript,spring,spring-mvc,Java,Javascript,Spring,Spring Mvc,这个问题不言自明。我想通过一个没有ajax的POST表单向我的控制器发送2个不同的对象数组 由于参数的大小,我将问题改为使用ajax和get请求。当前收到400(错误请求)。我不知道为什么。请看一看 我有目标: var phone = {phoneId:"", phoneNumber:"", phoneType:""}; var schedule = {scheduleId:"", time:"", day:""}; 我将其放入javascript数组中: var phones = [phon

这个问题不言自明。我想通过一个没有ajax的POST表单向我的控制器发送2个不同的对象数组

由于参数的大小,我将问题改为使用ajax和get请求。当前收到400(错误请求)。我不知道为什么。请看一看

我有目标:

var phone = {phoneId:"", phoneNumber:"", phoneType:""};
var schedule = {scheduleId:"", time:"", day:""};
我将其放入javascript数组中:

var phones = [phone1, phone2, phone3];
var schedules = [schedule1, schedule2];
我使用ajax发送:

var data = {
    index: id,
    schedules: schedules,
    phones: phones
}
var url = "/myController/myUrl"

$.getJSON(url, data, function(result){
    if(result.ok){
         $('#messageAlertSuccess').show();
    } else {
         $('#messageAlertError').show();    
    }
});
我创建了包装类来映射它们,如下所示:

public class PhoneWrapper(){
    private String phoneId;
    private String phoneNumber;
    private String phoneType;
}
当然,scheduleWrapper遵循相同的约定

以下是我的控制器中的方法:

@ResponseBody
@RequestMapping(value="/myUrl", method=RequestMethod.GET)
public Result doSomething(@RequestParam("index") int index,
                          @RequestParam("phones") Set<PhoneWrapper> phoneWrappers,
                          @RequestParam("schedules") Set<ScheduleWrapper> scheduleWrappers,
                          Model model,
                          HttpSession session){

         //do stuff here.

}

对于将请求参数映射到类实例字段,它们必须与参数的名称匹配

所以

<input type="hidden" name="someParameter" value="123"/>
Spring控制器将能够注入
SomeClass
实例,其字段
someParameter
具有来自html隐藏输入请求参数的值
123
。这也称为命令对象

javascript数组对html或http都没有意义

至于解决方案,我将保留您的类
PhoneWrapper
,使用javascript填充3个
元素,并将方法定义更改为

@RequestMapping(value=MY_URL, method=RequestMethod.POST)
public String doSomething(@RequestParam("index") int index, 
                      PhoneWrappers phoneWrappers, 
                      ScheduleWrappers scheduleWrappers,
                      Model model,
                      HttpSession session){

请注意,没有更多的数组
[]
括号。(对于
ScheduleWrappers
)您也会这样做。

我想说您就快到了!您需要的第一件事是一个包装器来保存两个
Set
参数,因为spring无法将集合直接映射到参数(还?)

另外,有两种方法可以处理此类请求:

  • 使用json请求和
    @Requestbody
    在请求体中使用单个javascript对象,并将其映射到java类(由spring自动执行)。这意味着您需要稍微更改数据的发送方式,这种方法有一个副作用:您不能简单地通过将参数定义为模型属性来合并数据

  • 第二种可能是继续使用post表单提交。这里还需要创建包装器并将其用作requestparam。一个是他在回答中提到的每一个参数,比如@Sotirios,或者一个包含两个集合的参数。然后,您需要修改您的提交数据以发送电话和日程安排信息,如输入字段。在这种情况下我没有使用集合,但是 列表和参数名称类似于
    phoneWrapper[0]。phoneId
    。 第二种方法的优点是,您可以将请求数据与现有值合并,这样就不需要一直发送完整的电话信息


    • 我看到一些事情看起来不太对劲

      除非包装器中有getter和setter(DTO是更好的名称),否则我不会将它们用于我的DTO的xhr调用,您需要进行更改

      public class PhoneWrapper(){
          private String phoneId;
          private String phoneNumber;
          private String phoneType;
      }
      
      有公共领域还是私有领域

      public class PhoneWrapper(){
          public String phoneId;
          public String phoneNumber;
          public String phoneType;
      }
      
      你的js数组不是数组而是对象

      var phones = {phone1, phone2, phone3};
      var schedules = {schedule1, schedule2};
      
      这里是数组

      var phones = [phone1, phone2, phone3];
      var schedules = [schedule1, schedule2];
      
      确保js和java双方的命名相同。我发现在对这些问题进行故障排除时打开调试非常有帮助。log4j-

      <logger name="org.springframework.web.servlet.mvc" >
          <level value="debug" />
      </logger>
      
      
      
      编辑

      因此,在问题更新了更多信息后,我注意到问题与

      这两个不是数组(方括号),而是对象(花括号)。 比照

      var phones = ["phone1", "phone2", "phone3"];
      var schedules = ["schedule1", "schedule2"];
      
      如果要传递实际的对象引用(phone1、phone2、phone3、schedule1和schedule2是对象变量),则需要使用

      var phones = [phone1, phone2, phone3];
      var schedules = [schedule1, schedule2];
      

      这不是我想要的解决方案。我重新编辑了问题,添加了
      数组
      部分。我也不能只映射到一个PhoneWrapper,因为我期待它们的集合。我不相信用纯html和默认的Spring配置就可以实现这一点。如果需要它们的集合,则需要使用JSON或XML之类的序列化模式,因此需要ajax。使用json反序列化到集合中。你必须手动完成。嗯,谢谢。我想我会等一会儿,以防有人回答,但我怀疑你是对的。也许你可以帮我,但我编辑了我的标题和代码以适应ajax。我一直得到一个404。更新了一点我的问题,我现在使用getjson和@requestbody,但现在得到了一个400。你能发布发送到服务器的确切json字符串和更新的requestmapping方法吗?请记住,您只需要一个命令对象来保存两个字段Set和SetYes。我希望你看到我修改了主帖子中的所有代码。我在那里发布了getJSON调用,其中包含一个索引、一个phones数组和一个schedules数组。我将用字符串更新主帖子。同样控制器方法也在文章中更新了。所以你使用的表单参数正确吗?难以解码获取url;)因此,您无法将requestparam直接映射到集合!必须将集合包装到对象中。构建一个类MyRequest,其中包含列表时间表和列表电话。首先使用一个列表来确定。然后下载spring mvc showcase应用程序并进行查看。有许多用例是以基本方式实现的。不幸的是,这是我原来问题中的一个输入错误。它们被正确定义为数组(因为我使用push将对象插入其中)。我也有设置和获取我的DTO/包装。我采取了不同的方法,但这个问题仍然悬而未决。话虽如此,我还是投票给了你们两个敏锐的眼光。不幸的是,它并没有解决我的问题:(啊!你发布的URL有帮助。请参阅@Nimchip。你应该更新你的问题以匹配上面的评论。问题中仍然有一个对象和一个数组。好的,它被编辑了。我相信我也尝试过这种方法,但由于某种原因它不起作用。Javascript
      object[]的映射
      进入
      PhoneWrapper[]
      var phones = {phone1, phone2, phone3};
      var schedules = {schedule1, schedule2};
      
      var phones = ["phone1", "phone2", "phone3"];
      var schedules = ["schedule1", "schedule2"];
      
      var phones = [phone1, phone2, phone3];
      var schedules = [schedule1, schedule2];