簡體   English   中英

Spring MVC和jQuery發布帶有POJO數組的請求

[英]Spring MVC and jquery post request with array of POJO

我有一個簡單的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錯誤。

編寫此代碼以獲取所有已檢查的表單,並將其全部發布到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> {}

嘗試使用@RequestBody而不是@RequestParam

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

@RequestBody方法參數注釋表示方法參數應綁定到HTTP請求正文的值,在您的情況下為HTTP數據。

我回答了我的問題。 表單客戶端我發送日期作為時間戳。 因為服務器不應該知道客戶端在哪個時區,也不應該依賴於特定的日期格式(這是最佳做法之一)。 之后,我在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”)以字符串形式發送Date-您需要定義自己的JsonDesiarilizer( Jackson中的 org.codehaus.jackson.map包)類,該類擴展了frpm JsonDeserializer類並實現你的邏輯。

您可以創建自己的格式化程序來解析傳入的請求。 在這里閱讀。 下面的代碼略有修飾。

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>>() {});
    }
}

jQuery:

$.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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM