Domanda

Is JSR-303 destinato anche per la convalida dei parametri metodo?

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

Grazie!

È stato utile?

Soluzione

Questo suona come un caso d'uso per AOP (AspectJ). Scrivi una pointcut per i metodi che sono annotati con javax.validation.constraints.*, iniettare un validatore nell'aspetto (probabilmente utilizzando Spring) e utilizzare un consiglio @Before o @Around per eseguire la convalida prima dell'esecuzione del metodo.

AspectJ in azione per riferimento.

Altri suggerimenti

di convalida dei livelli Metodo sarà supportato nella prossima versione 4.2 di implementazione di riferimento JSR 303 di Hibernate Validator.

Come sottolineato nella risposta precedente questo permetterà annotazioni di vincolo (built-in così come tipi definiti su misura) da specificare parametri del metodo e valori di ritorno per specificare pre e post-condizioni per l'invocazione di un metodo.

Si noti che HV saranno trattati solo con la convalida effettiva di chiamate di metodo non con innescando una tale convalida. Convalida invocazione potrebbe essere fatto utilizzando AOP o altri servizi di metodo di intercettazione come proxy dinamici del JDK.

Il problema JIRA per questo è HV-347 [1], così si potrebbe desiderare di aggiungere te stesso come osservatore a questo problema.

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

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

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

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

Ecco un esempio:

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

Sono, tuttavia, non sicuro di come che si integra con Primavera dal momento che non ne fanno uso. Si potrebbe semplicemente fare un tentativo.

In primavera 3.1.0 è possibile utilizzare @Validated annotazione per attivare la convalida su un POJO. Creare un'interfaccia per la classe POJO un mettere questa annotazione su di esso, quindi aggiungere le annotazioni di validazione nelle definizioni 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);
}

Il 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, ricordati di aggiungerlo nella configurazione di primavera questa dichiarazione di fagioli:

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

È possibile utilizzare jcabi-Aspetti (Sono uno sviluppatore), che integra JSR 303 con AspectJ. convalida effettiva è fatto da uno dei JSR 303 implementazioni, che si dovrà aggiungere al percorso della classe, come Hibernate Validator, o Apache BVAL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top