Estendendo @notempty per accettare altre classi
-
28-10-2019 - |
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!
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)