2010-10-24 5 views
4

Je suis nouveau avec le cadre de ressort. Je suis en train de construire quelques nouvelles forme de gestionnaire.Validation de champ non autorisée

Voici un échantillon de mon entité nouvelles:

class News 
{ 
    @NotNull 
    long id; 
    @NotNull 
    long idAuthor; 
    @Size(max=255) 
    String content; 
} 

Comme vous pouvez le voir, j'utiliser la validation des annotations JSR303 avec le printemps. Je veux valider mon "formulaire d'édition de nouvelles".

@RequestMapping(value = "/edit" , method = RequestMethod.POST) 
    public String editAction(@Valid @ModelAttribute News news, BindingResult result) 
    { 
     System.err.println(result.hasErrors()); 
      ... 
      return "editView"; 
    } 

Définir le terrain ont permis:

//initBinder function : 
    binder.setAllowedFields("content"); 

Eh bien, je suis en train de valider seul champ « de contenu » (champ autorisé sur mon classeur mis) ... Mais le printemps toujours valider tout le champ défini sur mon entité (donc "id" & "idAuthor" renvoie l'erreur)

Comment est-ce que je peux seulement valider le champ autorisé (mis sur la fonction d'initBinder)?

+0

Ai-je dû créer une entité spéciale avec uniquement le champ "content" ?? – Pierre

Répondre

4

Il n'y a pas de bonnes façons de le faire.

JSR-303 propose deux approches de validation sélective:

  • Vous pouvez valider les propriétés spécifiques en appelant validator.validateProperty(news, "content")
  • Vous pouvez définir des groupes de validation:

    @Size(max=255, groups = {Default.class, WebValidation.class})  
    String content; 
    

    et valider le groupe spécifié : validator.validate(news, WebValidation.class);

Aucune de ces approches n'est directement supportée par Spring MVC. Appelez une méthode JSR-303 Validator et appelez ces méthodes manuellement, mais elles renvoient Set<ConstraintViolation<?>> et le code pour placer ces ConstraintViolation dans BindingResult est enterré profondément dans les composants internes de Spring et ne peut pas être facilement réutilisé (voir SpringValidatorAdapter).

Il existe une demande de fonctionnalité pour la prise en charge des groupes de validation dans l'approche de style @Valid (SPR-6373) avec correctif version 3.1. Donc, en plus de créer une classe DTO spéciale, vous n'avez pas beaucoup d'options: vous pouvez utiliser la validation manuelle (sans JSR-303), ou vous pouvez copier-coller le code de SpringValidatorAdapter dans votre propre méthode utilitaire et appelez manuellement les méthodes de JSR-303 Validator.

+0

Hey, merci beaucoup, c'est exactement ce que j'ai cherché. – Pierre

Questions connexes