validator valid example bean java hibernate spring validation hibernate-validator

java - example - ¿Cómo resuelvo dinámicamente los parámetros del mensaje con Hibernate Validator?



hibernate validator example (1)

IMO, la solución simple es crear una implementación personalizada de javax.validation.MessageInterpolator . Delegue el trabajo principal en ResourceBundleMessageInterpolator Hibernate Validator y realice el trabajo de reemplazo requerido en CustomMessageInterpolator .

public class CustomMessageInterpolator extends org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator { private static final Pattern MESSAGE_PARAMETER_PATTERN = Pattern.compile( "(//{[^//}]+?//})" ); @Override public String interpolate(String message, Context context) { String resolvedMessage = super.interpolate(message, context); resolvedMessage = replacePropertyNameWithPropertyValues(resolvedMessage, context.getValidatedValue()); return resolvedMessage; } private String replacePropertyNameWithPropertyValues(String resolvedMessage, Object validatedValue) { Matcher matcher = MESSAGE_PARAMETER_PATTERN.matcher( resolvedMessage ); StringBuffer sb = new StringBuffer(); while ( matcher.find() ) { String parameter = matcher.group( 1 ); String propertyName = parameter.replace("{", ""); propertyName = propertyName.replace("}", ""); PropertyDescriptor desc = null; try { desc = new PropertyDescriptor(propertyName, validatedValue.getClass()); } catch (IntrospectionException ignore) { matcher.appendReplacement( sb, parameter ); continue; } try { Object propertyValue = desc.getReadMethod().invoke(validatedValue); matcher.appendReplacement( sb, propertyValue.toString() ); } catch (Exception ignore) { matcher.appendReplacement( sb, parameter ); } } matcher.appendTail( sb ); return sb.toString(); } }

@Prueba

public void validate() { Configuration<?> configuration = Validation.byDefaultProvider().configure(); ValidatorFactory validatorFactory = configuration.messageInterpolator(new CustomMessageInterpolator()).buildValidatorFactory(); Validator validator = validatorFactory.getValidator(); Product p = new Product(); Category cat = new Category(); cat.setName("s"); //assume specified name is invalid p.setCategory(cat); Set<ConstraintViolation<Product>> violations = validator.validate(p); for(ConstraintViolation<Product> violation : violations) { System.out.println(violation.getMessage()); } }

Salida

s is a product in the hazardous category list.

Estoy usando Hibernate Validator y me gustaría resolver el nombre de la categoría en un mensaje de error. Considere este simple escenario:

public class Category { private String name; } public class Product { @HazardousCategoryConstraint(message = "{haz.cat.error}") private Category category; private String name; } public class InventoryReport { @Valid private List<Product> products; } ValidationMessages.properties haz.cat.error={name} is a product in the hazardous category list.

Supongamos que tengo una implementación en funcionamiento de HazardousCategoryConstraint. El validador verifica el nombre de cada categoría con una lista de nombres restringidos. Cuando llamo a validate (InventoryReport) obtengo el número de errores que espero, excepto que son la misma cadena. Me gustaría ver el nombre de la Categoría resuelto en cada mensaje. ¿Puede alguien señalarme un ejemplo de cómo resolver parámetros dinámicamente o mostrarme cómo hacerlo?