3

-要素で使用しようとして@RequestMappingconsumesます。APIドキュメントContent-Typeを読み取ると、リクエストのヘッダーで機能します。ただし、

@RequestMapping(consumes = "application/x-www-form-urlencoded;charset=UTF-8", value = "/test")
public void test() {
  :
}

また

@RequestMapping(consumes = "application/x-www-form-urlencoded;charset=ISO-8859-1", value = "/test")
public void test() {
  :
}

違いはありません。リクエストのヘッダーは次のようになります

Content-Type: application/x-www-form-urlencoded;charset=UTF-8

また

Content-Type: application/x-www-form-urlencoded

test()可能な 4 つの星座すべてで呼び出されます。

ただし、これは、charset指定した場合、Spring が -part を認識して使用しようとする証拠です。

@RequestMapping(consumes = "application/x-www-form-urlencoded;charset=UTF-x8", value = "/test")
public void test() {
  :
}

Web アプリの起動中 (!) に例外が発生します。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Initialization of bean failed;
    nested exception is java.nio.charset.UnsupportedCharsetException: UTF-x8

-elementのドキュメントにproducesも の使用については言及されていませんが、charsetGoogle によると一部のユーザーはそれを使用していることに注意してください。

ここで何が起こっているのか、または私が間違っていることの手がかりはありますか?

ところで、これは Spring 3.1.1.RELEASE です。

4

1 に答える 1

13

あなたはすでに質問に答えていると思いますので、これはコードの観点から、charsetマッピングを解決するときに が考慮されない理由についての確認です。

Spring コードを掘り下げると、犯人はMediaType#includes(). 方法

さらに掘り下げると、メソッドのアノテーションRequestMappingInfoに関連して a が作成されていることがわかります。RequestMappingこれRequestMappingInfoは、一連のAbstractRequestConditionオブジェクトを格納します。そのうちの 1 つは、注釈の一部で定義されたConsumesRequestConditionを保持するです (つまり)。MediaTypeconsumesapplication/x-www-form-urlencoded;charset=UTF-8

後でリクエストが行われると、これには、のを抽出し、それが含まれているかどうかを確認するために独自のものと照合するメソッドを持つ内部クラスConsumesRequestConditionありConsumeMediaTypeExpressionますmatchMediaType()MediaTypeHttpServletRequestMediaType

MediaType#includes()実装 (426 行から 428 行)を見ると、type(ie application) とsubtype(ie ) が等しい場合に true が返され、この場合は残りの組み合わせを保持する Mapx-www-form-urlencodedは完全に無視されます。parameters"charset","UTF-8"

トラックを掘り下げるproducesと同様の結果が得られるようですが、この場合はMediaType#isCompatibleWith()メソッドが関与しており、繰り返しますが、 と が等しい場合にのみ到達しtypeますsubtype

Google で charset リクエスト マッピングが機能しているという証拠を見つけた場合produces、私はそれを疑うでしょう (Spring のコア部分が変更されない限り)。

なぜこのように設計されたのかについては、別の質問です:)

于 2012-10-09T19:59:03.143 に答える