आईएमओ, सरल समाधान javax.validation.MessageInterpolator
के कस्टम कार्यान्वयन को बनाना है। हाइबरनेट वैलिडेटर के ResourceBundleMessageInterpolator
पर मुख्य कार्य को प्रतिनिधि दें और 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();
}
}
@Test
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());
}
}
आउटपुट
s is a product in the hazardous category list.
क्या आप के लिए पूछ रहा है: कैसे त्रुटि संदेश स्ट्रिंग में एक मूल्य डाल करने के लिए? -- क्या ये सही है? – Ralph
@ राल्फ - यह सही है, लेकिन अधिक विशेष रूप से मैं इसे गतिशील होना चाहता हूं। मेरे पास अद्वितीय नामों के साथ श्रेणियों के कई उदाहरण हैं। –
लेकिन जिन नामों को आप संदेश में रखना चाहते हैं वे आपके सत्यापनकर्ता को जानते हैं, है ना? – Ralph