问题非常自我解释。我想通过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
答案 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
)做同样的事情。