java मैं हाइबरनेट वैलिएटर के साथ संदेश पैरामीटर को गतिशील कैसे हल करता हूं?



hibernate spring (1)

आईएमओ, सरल समाधान है कि javax.validation.MessageInterpolator का कस्टम कार्यान्वयन मुख्य काम को हाइबरनेट के रिसर्सबंडल मेसेज इन्टरपॉलेटर के लिए नियुक्त करें और 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();
    }

}

@परीक्षा

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.

मैं हाइबरनेट वैल्यूएटर का उपयोग कर रहा हूं और एक त्रुटि संदेश में श्रेणी के नाम को हल करना चाहता हूं। इस सरल परिदृश्य पर विचार करें:

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.

मान लें कि मेरे पास खतरनाक श्रेणी संयोजन के कार्यान्वयन का काम है। मान्यकर्ता प्रतिबंधित नामों की सूची के खिलाफ प्रत्येक श्रेणी का नाम जांचता है जब मैं मान्य करता हूं (इन्वेंटरी रिपोर्ट) मुझे त्रुटियों की संख्या मिलती है, सिवाय इसके कि वे एक ही स्ट्रिंग हैं। मैं प्रत्येक संदेश में श्रेणी के नाम का समाधान करना चाहता हूं। क्या कोई मुझे गतिशील रूप से मापदंडों को हल करने का उदाहरण देता है, या मुझे कैसे दिखा सकता है?





hibernate-validator