0

我有一个简单的 POJO Java 类(未显示 getter 和 setter)

public class VacationInfo {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Temporal(TemporalType.TIMESTAMP)
private Date vacationFrom;

@Temporal(TemporalType.TIMESTAMP)
private Date vacationTo;

, 带有下一个方法的 Spring MVC 控制器

@RequestMapping(value = "updateVacations", method = RequestMethod.POST)
public String updateVacations(@RequestParam VacationInfo[] vacationInfos) {
    ...
}

和 jQuery 发布请求

    $.ajax({
      type: "POST",
      url: "updateVacations",
      dataType: 'json',
      data: vacationInfos
    });

其中“vacationInfos”是一个带有 JSON 对象的数组,代表 VacationInfo 类:

[
 {
  vacationFrom: "01-01-2013",
  vacationTo: "01-01-2013"
 },
 {
  vacationFrom: "01-01-2013",
  vacationTo: "01-01-2013"
 }
]

但是当我请求时 - 我收到了 HTTP 400 错误。

4

4 回答 4

2

编写此代码是为了获取所有已检查的表单并将它们全部发布到 Spring 控制器

jQuery方法::

        $('#testButton').click(function(){
               var testList= [];

            $('.submit').filter(':checked').each(function() {
            var checkedFrom= $(this).closest('form');
            var testPojo= checkedFrom.serializeObject();
            testList.push(testPojo);
            });

            $.ajax({
            'type': 'POST',
                'url':"testMethod",
                'contentType': 'application/json',
                'data': JSON.stringify(testList),
                'dataType': 'json',
                success: function(data) {

                if (data == 'SUCCESS')
                {
                alert(data);
                }
                else
                    {
                    alert(data);
                    }

                }
            });

        });

而 jquery 提供了两个级别的序列化,如 serialize() 和 serializeArray()。但这是序列化的客户方法

用户定义的对象。

$.fn.serializeObject = function() {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name]) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

在弹簧控制器中

@RequestMapping(value = "/testMethod", method = RequestMethod.POST)
    public @ResponseBody ResponseStatus testMethod(HttpServletRequest request,
            @RequestBody TestList testList)
            throws Exception {
..............
}

其中 TestList 是另一个类,它被编写用于处理表单发布,其中包含用于测试方法的 mvc 控制器中的 Test 数组

public  class TestList extends ArrayList<Test> {}
于 2013-07-03T10:48:30.830 回答
0

尝试使用@RequestBody而不是@RequestParam

@RequestMapping(value = "updateVacations", method = RequestMethod.POST)
    public String updateVacations(@RequestBody  VacationInfo[] vacationInfos) {
    ...
}

@RequestBody方法参数注释表示方法参数应绑定到 HTTP 请求正文的值,在您的情况下为 JSON 数据。

于 2013-01-22T13:25:13.453 回答
0

我回答了我的问题。表单客户端我将日期作为时间戳发送。因为服务器不应该知道客户端是什么时区,也不应该依赖于特定的日期格式(这是最佳实践之一)。之后,我在 VacationInfo 日期字段上添加 JsonDeserializer 注释,这是工作。

public class VacationInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@JsonDeserialize(using=DateDeserializer.class)
@Temporal(TemporalType.TIMESTAMP)
private Date vacationFrom;

@JsonDeserialize(using=DateDeserializer.class)
@Temporal(TemporalType.TIMESTAMP)
private Date vacationTo;

Ajax POST 请求

[
  {
    vacationFrom: "1359197567033",
    vacationTo: "1359197567043"
  },
  {
    vacationFrom: "1359197567033",
    vacationTo: "1359197567043"
  }
]

如果您需要以特定格式(例如“mm-dd-yyyy”)将日期作为字符串发送 - 您需要定义自己的 JsonDesiarilizer(Jackson中的 org.codehaus.jackson.map 包)类,它扩展了 frpm JsonDeserializer 类并实现你的逻辑。

于 2013-01-26T10:55:54.140 回答
0

您可以创建自己的格式化程序来解析传入的请求。在这里阅读。下面的代码稍微修剪了一下。

public class LinkFormatter implements Formatter<List<Link>> {
    @Override
    public List<Link> parse(String linksStr, Locale locale) throws ParseException {
        return new ObjectMapper().readValue(linksStr, new TypeReference<List<Link>>() {});
    }
}

查询:

$.ajax({
    type: "POST",
    data: JSON.stringify(collection)
    ...
});

弹簧控制器:

@RequestParam List<Link> links

并且不要忘记在应用程序上下文中注册它:

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
  <set>
    <bean class="LinkFormatter"/>
  </set>
</property>

于 2013-09-05T08:58:31.617 回答