以下是我的问题示例:
1)我有一个XML文件,其中定义了我的发票的规则
<rules>
..
<price>
<Required>True</Required>
<MinValue>0.1</MinValue>
<price>
..
</rules>
2)我在java中有一个Invoice对象(重要的是:这应该保持原样(普通)。不应该包含任何注释或任何内容。)
public class Invoice implements Serializable {
private String details;
private String tax;
private String recipient;
private double price;
//getter and setter
}
3)至少我有一个验证器对象
public class Validator(){
public boolean validate(String xmlfile, Invoice i) {
//todo: Invoice i should be validated with xmlfile
}
}
我需要什么: Validator应该使用内部规则的XML文件 例如
<price>
<Required>True</Required>
<MinValue>0.1</MinValue>
<price>
并使用该规则验证Invoice java对象。
我可以使用哪些好的框架吗?还是教程?途径? 任何帮助都非常感谢。
谢谢。
答案 0 :(得分:3)
您可以使用Hibernate Validator这是JSR 303的实现。您可以在XML中编写约束,如下所示
<field name="x2" ignore-annotations="true" > <!-- XML is stronger -->
<constraint annotation="javax.validation.constraints.Min">
<element name="value">2</element>
</constraint>
</field>
可以找到完整而精彩的教程here
答案 1 :(得分:1)
从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's 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's 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");
}
}
}
答案 2 :(得分:0)
对于此用例,我将使用 Bean验证(JSR 303)的实现。验证规则可以定义为XML文档。
Hibernate Validator是参考实现,可以在这里下载:
JSR 303的实现也将包含在每个Java EE 6实现中。