4

これが私の質問の例です:

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) そして、少なくとも私は Validator オブジェクトを持っています

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 オブジェクトを検証します。

そのために使用できる優れたフレームワークはありますか? それともチュートリアル?近づく?どんな助けでも本当に感謝しています。

ありがとうございました。

4

3 に答える 3

3

JSR 303 の実装であるHibernate Validatorを使用できます。以下のように XML で制約を記述できます。

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

完全で素晴らしいチュートリアルはここにあります

于 2012-10-16T18:30:30.087 に答える
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");
         }

     }

}
于 2012-10-16T18:42:45.560 に答える
0

このユースケースでは、 Bean Validation ( JSR 303 )の実装を使用します。検証ルールは、XML ドキュメントとして定義できます。

Hibernate Validator は参照実装であり、ここからダウンロードできます。

JSR 303 の実装も、すべての Java EE 6 実装に含まれます。

于 2012-10-16T18:28:09.293 に答える