5

问题很不言自明。我想通过没有 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.

}

我目前正在获得 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

4 回答 4

3

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

除非您的包装器中有 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>

编辑

因此,在使用更多信息更新问题后,我注意到这与在 @RequestParam 中绑定列表相同的问题

于 2013-08-06T01:02:12.427 回答
2

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

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

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

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

于 2013-07-26T05:40:23.230 回答
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];
于 2013-08-06T13:20:15.703 回答
0

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

所以随着

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

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

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

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)。

于 2013-07-24T19:13:44.163 回答