2010-12-12 16 views
10

JSR-303 è destinato anche alla convalida dei parametri del metodo?Validazione dei parametri del metodo con JSR-303

Se sì, c'è qualche esempio sul web? La più grande sfida che sto affrontando è come ottenere un validatore all'interno di ciascun metodo. Con Spring 3, non significa che dovrei iniettare praticamente ogni classe con un LocalValidatorFactoryBean?

Grazie!

risposta

3

Questo sembra un caso d'uso per AOP (AspectJ). Scrivere un collegamento di punti per i metodi annotati con javax.validation.constraints.*, inserire un validatore nell'aspetto (probabilmente utilizzando Spring) e utilizzare un consiglio @Before o @Around per eseguire la convalida prima dell'esecuzione del metodo.

Leggere AspectJ in Action come riferimento.

3

Il javadocs per ciascuna delle JSR 303 annotazioni dice il seguente:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

Sede, PARAMETER c'è. Quindi, sì, è tecnicamente possibile.

Ecco un esempio:

public void method(@NotNull String parameter) { 
    // ... 
} 

Non sono però sicuro di come che si integra con molla dal momento che non lo uso. Potresti fare un tentativo.

9

La convalida del livello di metodo sarà supportata nella prossima versione 4.2 dell'implementazione di riferimento di JSR 303 Hibernate Validator.

Come indicato nella risposta precedente, questo consentirà di specificare le annotazioni di vincolo (tipi predefiniti e predefiniti) nei parametri del metodo e i valori restituiti per specificare le condizioni pre e post per l'invocazione di un metodo.

Si noti che HV gestirà solo la convalida effettiva delle chiamate al metodo non con l'attivazione di tale convalida. L'invocazione della convalida può essere eseguita utilizzando AOP o altre strutture di intercettazione dei metodi come i proxy dinamici di JDK.

Il problema di JIRA per questo è HV-347 [1], quindi è possibile aggiungere te stesso come osservatore a questo problema.

[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347

+0

Penso che il tuo post sul blog integra la tua risposta;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

Gunnar è stato abbastanza gentile da mettere la sua soluzione in [GitHub] (https://github.com/gunnarmorling/methodvalidation-integration). Ha funzionato alla grande per me. – Patrick

0

È possibile utilizzare jcabi-aspects (Sono uno sviluppatore), che integra JSR 303 con AspectJ. La validazione effettiva viene eseguita da una delle implementazioni di JSR 303, che dovrai aggiungere al percorso della classe, come Hibernate Validator o Apache BVal.

2

Nella primavera 3.1.0 è possibile utilizzare l'annotazione @Validata per attivare la convalida su un pojo. Creare un'interfaccia per la classe pojo e inserire questa annotazione su di essa, quindi aggiungere le annotazioni di convalida nelle definizioni dei metodi.(L'interfaccia è necessario perché Primavera creerà una classe proxy utilizzando l'interfaccia come definizione)

@Validated 
public interface PojoClass { 
    public @NotNull String doSomething(@NotEmpty String input); 
} 

tuo POJO:

public class PojoClassImpl implements PojoClass { 
    public String doSomething(String input) { 
     return ""; 
    } 
} 

A partire da un'applicazione di primavera web standard con la convalida attiva, ricordarsi di aggiungere in la configurazione di primavera questa dichiarazione di fagioli:

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 
+0

Per qualche strano motivo ConstraintViolationException public \ @NotNull String doSomething(); non ha funzionato ma \ @NotNull public String doSomething(); fatto. Usato la barra per sfuggire al simbolo At che è stato confuso dall'utente con S.O – borjab

Problemi correlati