私はjsonRESTapiを構築するためにjacksonでRestlet2.1を使用しています。
予期されたコンテンツタイプで不正な形式の本文でリクエストを行うと、415の「サポートされていないメディアタイプ」ステータスコードが返されます。正しいエラーコードは400「BadRequest」だと思います。
どうやら、ジャクソンがゴミをデコードしようとして失敗したときに混乱が発生しているようです。
いくつかのコードを使用して、ケースをより明確にしようとします。
// java method mapping
@Post("json")
public Project create(Project project) {
curlを使用したサービスの呼び出し
$ curl -i -XPOST -H 'content-type: application/json' -d '{xgarbage}' http://localhost:8080/projects HTTP/1.1 415 Unsupported Media Type
そして、ログに記録されたスタックトレースの断片:
Nov 29, 2010 9:51:56 PM org.restlet.ext.jackson.JacksonRepresentation getObject
WARNING: Unable to parse the object with Jackson.
org.codehaus.jackson.JsonParseException: Unexpected character ('x' (code 120)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.ByteArrayInputStream@693e4a5a; line: 1, column: 2]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:929)
サービスの実際の実装がヒットすることはないため、どこかで文字化けしたコンテンツを415にマップすることが決定されます。
さて、私の質問は:これは正しいですか?「RESTfulWebサービス」という本からの次の引用を正しく読んでいれば、そうではありませんが、訂正の余地があります。
[400 Bad Request]これは、クライアントがPUTまたはPOSTリクエストとともに表現を送信し、表現が正しい形式である場合によく使用されますが、意味がありません。
。
[415サポートされていないメディアタイプ]クライアントが正しいメディアタイプを持っているが間違ったフォーマットのドキュメント(間違った語彙で書かれたXMLドキュメントなど)を送信する場合、より一般的な400(「不正な要求」)がより適切な応答になります。
正しいか間違っているか、私は400を返したいと思います。
ジャクソンが提供する自動マジックシリアル化を放棄せずに動作を変更する方法はありますか?
どんな助けでも大歓迎です、ありがとう!