Printemps @RequestMapping consomme charset?
Je suis en train d'utiliser @RequestMapping
avec le consumes
-élément. La lecture de la API-document il fonctionne sur le Content-Type
-d'en-tête de la demande. Cependant, l'utilisation de
@RequestMapping(consumes = "application/x-www-form-urlencoded;charset=UTF-8", value = "/test")
public void test() {
:
}
ou
@RequestMapping(consumes = "application/x-www-form-urlencoded;charset=ISO-8859-1", value = "/test")
public void test() {
:
}
ne pas faire une différence. L'en-tête de la demande peut ressembler à
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
ou
Content-Type: application/x-www-form-urlencoded
test()
sera appelé dans tous les quatre constellations.
Cependant, et c'est la preuve pour moi que le Printemps voit et essaie d'utiliser le charset
-partie, si je spécifie
@RequestMapping(consumes = "application/x-www-form-urlencoded;charset=UTF-x8", value = "/test")
public void test() {
:
}
J'obtiens une exception lors du démarrage (!) de la web-app:
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
Notez que la documentation sur le produces
-élément ne mentionne pas l'utilisation de charset
, mais selon Google, certains l'utilisent.
Des indices à ce qui se passe ici, ou ce que je fais mal?
BTW, c'est le Printemps 3.1.1.La LIBÉRATION.
OriginalL'auteur sjngm | 2012-10-09
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez déjà répondu à votre question, donc c'est plus une confirmation, à partir d'un code de point de vue, pourquoi l'
charset
n'est pas pris en compte lors de la résolution des mappages.En creusant dans le Printemps de code, le coupable semble être le
MediaType#includes()
. méthodePlus de creuser révèle qu'un
RequestMappingInfo
est créé en association à laRequestMapping
annotation de la méthode. CetteRequestMappingInfo
stocke une série deAbstractRequestCondition
objets, l'un d'eux étant leConsumesRequestCondition
qui détient leMediaType
définis dans leconsumes
partie de l'annotation (c'est à direapplication/x-www-form-urlencoded;charset=UTF-8
).Plus tard, quand une demande est faite, ce
ConsumesRequestCondition
a un intérieureConsumeMediaTypeExpression
de la classematchMediaType()
méthode que des extraits de laMediaType
de laHttpServletRequest
et vérifie l'encontre de son propreMediaType
pour voir si il est inclus.Si vous regardez la
MediaType#includes()
de mise en œuvre (Lignes 426 à 428), elle renvoie true lorsquetype
(c'est à direapplication
) etsubtype
(c'est à direx-www-form-urlencoded
) sont égaux, ignorant complètement lesparameters
Carte qui dans ce casdétient le reste
"charset","UTF-8"
combinaison.De creuser dans le
produces
piste semble montrer des résultats similaires, mais dans ce cas c'est leMediaType#isCompatibleWith()
méthode en cause, et encore, il ne parvient qu'àtype
etsubtype
si elles sont égales.Si vous avez trouvé des preuves sur Google de la
produces
de travail pour le charset demande de la cartographie, j'en doute (sauf si ils ont changé de base Printemps trucs)Pourquoi il a été conçu de cette façon, eh bien, c'est une autre question 🙂
OriginalL'auteur betomontejo