【问题标题】:sending javascript object arrays as parameters to controller将 javascript 对象数组作为参数发送到控制器
【发布时间】:2013-07-24 10:40:12
【问题描述】:

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

【问题讨论】:

    标签: java javascript spring spring-mvc


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 稍微更新了我的问题,我现在正在使用 getjson 和 @requestbody,但目前得到了 400。
    • 你能发布发送到服务器的确切 json 字符串和更新的请求映射方法吗?请记住,您只需要一个包含两个字段 Set 和 Set 的命令对象
    • 是的。我希望你看到我修改了主帖中的所有代码。我在那里发布了 getJSON 调用,其中包含一个索引、一个电话数组和一个时间表数组的数据对象。我将用字符串更新主帖。控制器方法也在帖子中更新。
    • 那么您使用的表单参数正确吗?很难解码获取 url ;) 所以你不能将 requestparam 直接映射到 set!您必须将您的集合包装在一个对象中。构建一个 MyRequest 类,其中包含 List 时间表和 List 电话。首先使用一个列表来确定。
    • 另外下载 spring mvc 展示应用看看。有很多用例以基本方式实现。 github.com/SpringSource/spring-mvc-showcase
    【解决方案2】:

    我看到一些看起来不正确的东西

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

    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>
    

    编辑

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

    【讨论】:

    • 不幸的是,我原来的问题是一个错字。它们被正确定义为数组(因为我使用 push 将对象插入其中)。我的 DTO/Wrappers 也有设置和获取。我采用了不同的方法,但这个问题仍然是开放的。话虽这么说,我赞成你们两个有敏锐的眼光。不幸的是它不能解决我的问题:(
    • 啊!您发布的网址有所帮助。见stackoverflow.com/questions/4596351/…
    • @Nimchip 您应该更新您的问题以匹配您上面的评论。你在问题中仍然有一个对象与一个数组。
    • 好的,已编辑。我相信我也尝试过这种方法,但由于某种原因它不起作用。从 Javascript Object[]PhoneWrapper[]ScheduleWrapper[] 的映射尚未完成。但是,在将数据传递给控制器​​时,用括号命名参数非常重要,否则它将不会将其视为传入数组。
    • 没有括号。您的请求参数应类似于 myparam=myValue1&myparam=myValue2&myparam=myValue3
    【解决方案3】:
    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];
    

    【讨论】:

    • 查看我对 denov 的回复
    • "phones" 不是有效的对象格式 - 它必须有键值对
    【解决方案4】:

    spring map请求参数到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个&lt;input&gt;元素,并将方法定义更改为

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

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

    【讨论】:

    • 这不是我正在寻找的解决方案。我重新编辑了添加array 部分的问题。我也不能只映射到单个 PhoneWrapper,因为我期待它们的集合。
    • 我不相信你可以用纯 html 和默认的 Spring 配置来实现这一点。如果您期望它们的集合,则需要使用 JSON 或 XML 之类的序列化模式,因此需要 ajax。
    • 您必须使用过滤器或拦截器,获取输入参数的 JSON 值。使用 json 反序列化为一个集合。您必须手动执行此操作。
    • 嗯,谢谢。我想我会稍等一下,以防其他人回答,但我怀疑你是对的。
    • 也许你可以帮帮我,但我编辑了我的标题和代码以适应 ajax。我不断收到 404。
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多