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)

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.

19
demandé sur Elnur Abdurrakhimov 2011-05-25 22:46:24

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

9
répondu Ritesh 2011-06-13 11:36:31

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.

2
répondu Chandra 2011-10-18 17:20:35