Check Java object with rules in xml

Here is an example of my question:

1) I have XML files in which the rules for my account are fixed

<rules> .. <price> <Required>True</Required> <MinValue>0.1</MinValue> <price> .. </rules> 

2) I have an invoice object in java (important: it should remain so (simple) . No annotations or anything else should be included.)

 public class Invoice implements Serializable { private String details; private String tax; private String recipient; private double price; //getter and setter 

}

3) And at least I have a Validator object

 public class Validator(){ public boolean validate(String xmlfile, Invoice i) { //todo: Invoice i should be validated with xmlfile } } 

What I need: The validator should take an XML file with rules inside for example

  <price> <Required>True</Required> <MinValue>0.1</MinValue> <price> 

and use this rule to validate the Invoice Java object.

Is there any good framework that I could use for this? Or textbooks? Approaches? Any help is really appreciated.

Thanks.

+4
source share
3 answers

You can use the Hibernate Validator , which is an implementation of JSR 303. You can write constraints in XML, as shown below

 <field name="x2" ignore-annotations="true" > <!-- XML is stronger --> <constraint annotation="javax.validation.constraints.Min"> <element name="value">2</element> </constraint> </field> 

Here you can find a complete and enjoyable study guide here.

+2
source

Take a look at this example with Apache.

 public class ValidateExample extends Object { /** * We need a resource bundle to get our field names and errors messages * from. Note that this is not strictly required to make the Validator * work, but is a good coding practice. */ private static ResourceBundle apps = ResourceBundle.getBundle( "org.apache.commons.validator.example.applicationResources"); /** * This is the main method that will be called to initialize the Validator, create some sample beans, and * run the Validator against them. */ public static void main(String[] args) throws ValidatorException, IOException, SAXException { InputStream in = null; ValidatorResources resources = null; try { // Create a new instance of a ValidatorResource, then get a stream // handle on the XML file with the actions in it, and initialize the // resources from it. This would normally be done by a servlet // run during JSP initialization or some other application-startup // routine. in = ValidateExample.class.getResourceAsStream("validator-example.xml"); resources = new ValidatorResources(in); } finally { // Make sure we close the input stream. if (in != null) { in.close(); } } // Create a test bean to validate against. ValidateBean bean = new ValidateBean(); // Create a validator with the ValidateBean actions for the bean // we're interested in. Validator validator = new Validator(resources, "ValidateBean"); // Tell the validator which bean to validate against. validator.setParameter(Validator.BEAN_PARAM, bean); ValidatorResults results = null; // Run the validation actions against the bean. Since all of the properties // are null, we expect them all to error out except for street2, which has // no validations (it an optional property) results = validator.validate(); printResults(bean, results, resources); // Now set all the required properties, but make the age a non-integer. // You'll notice that age will pass the required test, but fail the int // test. bean.setLastName("Tester"); bean.setFirstName("John"); bean.setStreet1("1 Test Street"); bean.setCity("Testville"); bean.setState("TE"); bean.setPostalCode("12345"); bean.setAge("Too Old"); results = validator.validate(); printResults(bean, results, resources); // Now only report failed fields validator.setOnlyReturnErrors(true); results = validator.validate(); printResults(bean, results, resources); // Now everything should pass. validator.setOnlyReturnErrors(false); bean.setAge("123"); results = validator.validate(); printResults(bean, results, resources); } /** * Dumps out the Bean in question and the results of validating it. */ public static void printResults( ValidateBean bean, ValidatorResults results, ValidatorResources resources) { boolean success = true; // Start by getting the form for the current locale and Bean. Form form = resources.getForm(Locale.getDefault(), "ValidateBean"); System.out.println("\n\nValidating:"); System.out.println(bean); // Iterate over each of the properties of the Bean which had messages. Iterator propertyNames = results.getPropertyNames().iterator(); while (propertyNames.hasNext()) { String propertyName = (String) propertyNames.next(); // Get the Field associated with that property in the Form Field field = form.getField(propertyName); // Look up the formatted name of the field from the Field arg0 String prettyFieldName = apps.getString(field.getArg(0).getKey()); // Get the result of validating the property. ValidatorResult result = results.getValidatorResult(propertyName); // Get all the actions run against the property, and iterate over their names. Map actionMap = result.getActionMap(); Iterator keys = actionMap.keySet().iterator(); while (keys.hasNext()) { String actName = (String) keys.next(); // Get the Action for that name. ValidatorAction action = resources.getValidatorAction(actName); // If the result is valid, print PASSED, otherwise print FAILED System.out.println( propertyName + "[" + actName + "] (" + (result.isValid(actName) ? "PASSED" : "FAILED") + ")"); //If the result failed, format the Action message against the formatted field name if (!result.isValid(actName)) { success = false; String message = apps.getString(action.getMsg()); Object[] args = { prettyFieldName }; System.out.println( " Error message will be: " + MessageFormat.format(message, args)); } } } if (success) { System.out.println("FORM VALIDATION PASSED"); } else { System.out.println("FORM VALIDATION FAILED"); } } } 
+1
source

I would use the Bean Validation implementation ( JSR 303 ) for this use case. Validation rules can be defined as an XML document.

Hibernate Validator is a reference implementation that can be downloaded here:

A JSR 303 implementation will also be included in every Java EE 6 implementation.

0
source

Source: https://habr.com/ru/post/1440116/


All Articles