Comment utiliser @Valid avec les paramètres @RequestBody de Spring MVC?
je rencontre un problème avec l'utilisation de @Valid
sur un paramètre à une méthode de gestionnaire sur mon @Controller
. Mon code ressemble à ceci:
@RequestMapping(value=BIBBLE_BOBBLE_URI_PATTERN + "/widgets", method=RequestMethod.POST)
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public Widget saveNewWidget(
@PathVariable final String username,
@PathVariable final String bibbleBobbleName,
@Valid @RequestBody final Widget widget,
final BindingResult results,
final HttpServletRequest request,
final HttpServletResponse response)
où Widget
est la classe pour un de mes objets de domaine. Je suis l'aide de la @RequestBody
annotation pour indiquer que la charge utile de la demande correspond à widget
(dans mes tests, les requêtes sont JSON, bien que Jackson soit sur mon classpath donc je pourrais aussi utiliser XML).
Comme vous pouvez le voir, le BindingResult
le paramètre suit directement après le Widget
paramètre, mais j'obtiens l'erreur suivante:
java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!
Comment appliquer le @Valid
annotation à un @RequestBody
paramètres et ensuite obtenir les résultats?
P.S. j'utilise annotation-driven
pour gérer le câblage des contrôleurs, faire des négociations de contenu, etc.
2 réponses
utilisez-vous Spring 3.1? Il s'agit d'une nouvelle fonctionnalité ajoutée dans la version de printemps 3.1. Merci de voir Validation Pour @RequestBody Arguments De Méthode
il s'agit d'un problème au printemps 3.0 et il est fixé à 3,1 M2.
https://jira.springsource.org/browse/SPR-6709
si vous utilisez spring 3.0, basé sur quelques fils et une lecture extensive, voici la meilleure approche pour ce problème. Une approche orientée vers l'aspect pour que nous puissions revenir en arrière lorsque vous mettez à niveau vers la version de spring qui corrige ce problème.
un aspect qui intercepte les appels à la méthode qui utilise @RequestMapping annotation et pour chaque paramètre qui est @Valide annotation sur elle, appelez le validateur correspondant dans l'aspect.