今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

SpringでJSON受信時に400エラーが返される問題

ブラウザからajaxJSONを送信したときに、サーバーから400エラーが返されてオブジェクトの追加や更新ができない問題が発生した。
サーバー側ではまったくログが表示されていないけど、ブラウザ側には400エラーが返されている。

HTMLの中にはこんなメッセージが。

The request sent by the client was syntactically incorrect

クライアントから送信したリクエストが変だと怒られてるっぽい。

原因がわからなくてぐぐりまくってようやくわかったのが、クライアントから送信したJSONには、オブジェクトのプロパティのうち一部が存在してないことによるエラーらしかった。

そのオブジェクトにはListメンバーが存在していて、それに対応する要素がJSONになかったからエラーになっているらしい。

@Entity
@Table(name = "hoge")
public class Hoge {
    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue
    private long id;

    @Column(name = "name")
    private String name;

    @ElementCollection
    @Transient
    private List<Hoge> childs;

    // getter/setter
}

要素が足りないのならと、最初はJSONにchildsを追加してみたけど、状況はまったく変わらず。

さらにぐぐってたら、JSONに要素が含まれていなくても無視するようにするには、クラスに @JsonIgnoreProperties アノテーションをつければいいみたいな情報を発見した。

jackson - Spring MVC : The request sent by the client was syntactically incorrect - Stack Overflow

@Entity
@Table(name = "hoge")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Hoge {
    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue
    private long id;

    @Column(name = "name")
    private String name;

    @ElementCollection
    @Transient
    private List<Hoge> childs;

    // getter/setter
}

これでエラーが出なくなった。