Domanda

Ho cercato di creare un validatore personalizzato in modo da poter semplicemente usare l'annotazione @Notempty per classi specifiche (java.util.calendar o commandotem in questo caso). Ma ho un'eccezione:

javax.validation.UnexpectedTypeException: No validator could be found for type: com.bla.DocumentCommandItem 

Ora, l'unica cosa che posso pensare al perché non funziona è che l'annotazione @notempty stessa dichiara questo:

@Constraint(validatedBy = { })

Quindi non esiste un'associazione diretta alla classe Validatore. Ma allora come convalida le stringhe e le collezioni?

Questa è la mia classe di validatore:

    public class DocumentNotEmptyExtender implements ConstraintValidator<NotEmpty,DocumentCommandItem> {

@Override
public void initialize( NotEmpty annotation ) {
}

@Override
public boolean isValid( DocumentCommandItem cmdItem, ConstraintValidatorContext context ) {
    if ( !StringUtils.hasText( cmdItem.getId() ) && (cmdItem.getFilename() == null || cmdItem.getFilename().isEmpty()) ) {
        return false;
    } else {
        return true;
    }
}

}

È anche possibile?

(Come nota a margine ... Ho anche ricevuto questa eccezione quando stavo realizzando la mia annotazione simile, ma quella misteriosamente è scomparsa.)

Grazie!

È stato utile?

Soluzione

Devi registrare il tuo validatore in un file di mappatura dei vincoli come questo:

<constraint-mappings
    xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
        "http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd">

    <constraint-definition annotation="org.hibernate.validator.constraints.NotEmpty">
        <validated-by include-existing-validators="true">
            <value>com.foo.NotEmptyValidatorForDocumentCommandItem</value>
        </validated-by>
    </constraint-definition>
</constraint-mappings>

Questo file di mappatura deve essere registrato in META-INF/validation.xml:

<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">

    <constraint-mapping>/your-mapping.xml</constraint-mapping>
</validation-config>

Puoi saperne di più nel validatore di Hibernate guida di riferimento e la convalida dei fagioli specifica.

Altri suggerimenti

La soluzione è elencata sopra da @gunnar

Ha causato alcune cose inaspettate però ...

NotEmpty è fondamentalmente un wrapper per i vincoli @NotNull e @size (min = 1). Quindi non esiste un'implementazione effettiva di @Notempty.

Fare la mia implementazione @notempty per documentComManditem ha causato 2 cose:

  • Validatore di innesco di una validazione notnull e dimensioni (e quindi un "nessun validatore trovato" per la combinazione Dimensione-DocumentComanditem
  • Ancora più importante, le validazioni della corda di dimensioni hanno iniziato a fallire perché non è riuscito a trovare un'implementazione per questo.

Quindi la mia soluzione finale per questo problema:

Effettua un'implementazione @Size per DocumentComManditem e crea un'implementazione @Notempty per String

(e forse dovrò fare un altro @notempty per le collezioni)

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