0

私は単純な POJO Java クラスを持っています (ゲッターとセッターは表示されていません)

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」は、VacationInfo クラスを表す JSON オブジェクトの配列です。

[
 {
  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() のような 2 つのレベルのシリアライゼーションを提供します。

ユーザー定義オブジェクト。

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

私は私の質問に答えました。フォーム クライアント Date をタイムスタンプとして送信します。サーバーは、クライアントがどのタイム ゾーンであるかについて何も認識してはならず、特定の日付形式に依存してはならないためです (これはベスト プラクティスの 1 つです)。その後、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"
  }
]

Date を特定の形式 ("mm-dd-yyyy" など) の文字列として送信する必要がある場合 - frpm JsonDeserializer クラスを拡張して実装する独自の JsonDesiarilizer ( Jacksonの org.codehaus.jackson.map パッケージ) クラスを定義する必要があります。あなたの論理。

于 2013-01-26T10:55:54.140 に答える
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

着信要求を解析する独自のフォーマッターを作成できます。ここを読んでください。以下のコードは少しトリミングされています。

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

Jクエリ:

$.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 に答える