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

时间:2013-07-24 19:06:44

标签: java javascript spring spring-mvc

问题非常自我解释。我想通过POST表单发送2个不同的对象数组,而没有ajax到我的控制器。

由于params的大小,我将问题改为使用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.

}

我目前得到400.那有什么不对?


更新:这是.getJSON jquery方法正在构建的URL:

http://localhost:8080/myApp/myController/myUrl?index=9&schedules%5B0%5D%5BscheduleId%5D=1&schedules%5B0%5D%5BfromDay%5D=Monday&schedules%5B0%5D%5BtoDay%5D=Friday&schedules%5B0%5D%5BfromTime%5D=08%3A30%3A00&schedules%5B0%5D%5BtoTime%5D=16%3A00%3A00&schedules%5B1%5D%5BscheduleId%5D=5&schedules%5B1%5D%5BfromDay%5D=Saturday&schedules%5B1%5D%5BtoDay%5D=Monday&schedules%5B1%5D%5BfromTime%5D=09%3A00%3A00&schedules%5B1%5D%5BtoTime%5D=13%3A00%3A00&phones%5B0%5D%5BphoneId%5D=6&phones%5B0%5D%5BphoneNumber%5D=787-788-1111&phones%5B0%5D%5BphoneType%5D=PHONE&phones%5B1%5D%5BphoneId%5D=106&phones%5B1%5D%5BphoneNumber%5D=787-795-4095&phones%5B1%5D%5BphoneType%5D=FAX

4 个答案:

答案 0 :(得分:3)

我看到一些看起来不正确的事情

除非你的包装中有getter和setter(DTO是一个更好的名字),我不会将它们用于我的DTO进行xhr调用,你需要更改

public class PhoneWrapper(){
    private String phoneId;
    private String phoneNumber;
    private String phoneType;
}

拥有公共字段vs私人

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>

修改

所以在问题更新了更多信息后,我注意到它与Binding a list in @RequestParam

的问题相同

答案 1 :(得分:2)

我会说你快到了!你需要的第一件事就是一个包含两个Set<>参数的包装器,因为spring无法将一个集合直接映射到参数(还有?)。

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

  • 使用json请求和@Requestbody在请求正文中使用单个javascript对象将其映射到java类(由spring自动映射)。这意味着您需要稍微改变数据的发送方式,这种方法有一个副作用:只需将参数定义为模型属性,就无法合并数据。

  • 第二种可能性是留在帖子表单提交。此外,您还需要创建包装器并将其用作请求参数。每个Set中的任何一个&lt;&gt;像@Sotirios这样的参数在他的答案或一个参数中提到了两个集合。然后,您需要修改提交数据以发送电话和安排输入字段等信息。我没有在这种情况下使用套装但是 列表和参数名称看起来像phoneWrapper[0].phoneId。 第二种方法的优点是您可以将请求数据与现有值合并,因此您无需始终发送完整的电话信息。

答案 2 :(得分:1)

var phones = {phone1, phone2, phone3};
var schedules = {schedule1, schedule2};

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

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

如果您要传递实际的对象引用(phone1,phone2,phone3,schedule1和schedule2是对象变量),那么您需要使用

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

答案 3 :(得分:0)

对于Spring请求参数到Class实例字段,它们必须匹配参数的名称。

所以用

<input type="hidden" name="someParameter" value="123"/>

public class SomeClass {
    private String someParameter;
    // getters and setters
}

Spring控制器将能够注入一个SomeClass实例,其实例someParameter具有来自html隐藏输入请求参数的值123。这也称为命令对象。

javascript数组对html或http没有任何意义。

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

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

请注意,没有更多数组[]括号。 (你会对ScheduleWrappers)做同样的事情。