This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.3
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.3 by this push:
     new 8368262406 feat: Validator supports automatic switch (#14194)
8368262406 is described below

commit 83682624061f8adf04e346917cf37007d83d1ffc
Author: aofall <[email protected]>
AuthorDate: Wed May 22 11:12:00 2024 +0800

    feat: Validator supports automatic switch (#14194)
    
    * feat: Validator supports automatic switch
    
    Add an adapter for javax and jakarta that it can automatically switch
    
    Support disabling validation when parameter is 'false' that it is expected 
the description in document the parameter type is boolean
    
    * revert the default extension name
---
 .../org/apache/dubbo/validation/Validator.java     |  2 ++
 .../dubbo/validation/filter/ValidationFilter.java  |  3 ++-
 .../{JValidation.java => AdapterValidation.java}   | 29 +++++++++++++---------
 .../support/jvalidation/JValidation.java           |  2 ++
 .../support/jvalidation/JValidationNew.java        |  2 ++
 .../validation/support/jvalidation/JValidator.java | 10 ++++++++
 .../support/jvalidation/JValidatorNew.java         | 10 ++++++++
 .../org.apache.dubbo.validation.Validation         |  5 ++--
 8 files changed, 48 insertions(+), 15 deletions(-)

diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/Validator.java
 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/Validator.java
index f60f31bc2e..27e7854d32 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/Validator.java
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/Validator.java
@@ -23,4 +23,6 @@ package org.apache.dubbo.validation;
 public interface Validator {
 
     void validate(String methodName, Class<?>[] parameterTypes, Object[] 
arguments) throws Exception;
+
+    boolean isSupport();
 }
diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/filter/ValidationFilter.java
 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/filter/ValidationFilter.java
index 849cf65839..2074222983 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/filter/ValidationFilter.java
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/filter/ValidationFilter.java
@@ -105,6 +105,7 @@ public class ValidationFilter implements Filter {
     private boolean needValidate(URL url, String methodName) {
         return validation != null
                 && !methodName.startsWith("$")
-                && ConfigUtils.isNotEmpty(url.getMethodParameter(methodName, 
VALIDATION_KEY));
+                && ConfigUtils.isNotEmpty(url.getMethodParameter(methodName, 
VALIDATION_KEY))
+                && !"false".equalsIgnoreCase(url.getParameter(VALIDATION_KEY));
     }
 }
diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidation.java
 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/AdapterValidation.java
similarity index 58%
copy from 
dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidation.java
copy to 
dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/AdapterValidation.java
index 6a8890fbb8..e0dfc7fcb4 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidation.java
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/AdapterValidation.java
@@ -20,20 +20,25 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.validation.Validator;
 import org.apache.dubbo.validation.support.AbstractValidation;
 
-/**
- * Creates a new instance of {@link Validator} using input argument url.
- * @see AbstractValidation
- * @see Validator
- */
-public class JValidation extends AbstractValidation {
+import java.util.Arrays;
+import java.util.List;
+
+public class AdapterValidation extends AbstractValidation {
 
-    /**
-     * Return new instance of {@link JValidator}
-     * @param url Valid URL instance
-     * @return Instance of JValidator
-     */
     @Override
     protected Validator createValidator(URL url) {
-        return new JValidator(url);
+        List<Class<? extends Validator>> validatorList = 
Arrays.asList(JValidator.class, JValidatorNew.class);
+        for (Class<? extends Validator> instance : validatorList) {
+            try {
+                Validator validator = 
instance.getConstructor(URL.class).newInstance(url);
+                if (validator.isSupport()) {
+                    return validator;
+                }
+            } catch (Throwable ignore) {
+            }
+        }
+        throw new IllegalArgumentException(
+                "Failed to load jakarta.validation.Validation or 
javax.validation.Validation from env. "
+                        + "Please import at least one validator");
     }
 }
diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidation.java
 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidation.java
index 6a8890fbb8..bd963c43f7 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidation.java
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidation.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.validation.support.jvalidation;
 
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.validation.Validator;
 import org.apache.dubbo.validation.support.AbstractValidation;
 
@@ -25,6 +26,7 @@ import org.apache.dubbo.validation.support.AbstractValidation;
  * @see AbstractValidation
  * @see Validator
  */
+@Activate(onClass = "javax.validation.Validation")
 public class JValidation extends AbstractValidation {
 
     /**
diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidationNew.java
 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidationNew.java
index a1dccd2e4f..95ec7b4332 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidationNew.java
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidationNew.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.validation.support.jvalidation;
 
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.validation.Validator;
 import org.apache.dubbo.validation.support.AbstractValidation;
 
@@ -25,6 +26,7 @@ import org.apache.dubbo.validation.support.AbstractValidation;
  * @see AbstractValidation
  * @see Validator
  */
+@Activate(onClass = "jakarta.validation.Validation")
 public class JValidationNew extends AbstractValidation {
 
     /**
diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidator.java
 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidator.java
index e19904ac16..381ee5263e 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidator.java
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidator.java
@@ -309,6 +309,16 @@ public class JValidator implements Validator {
         }
     }
 
+    @Override
+    public boolean isSupport() {
+        Class<?> cls = null;
+        try {
+            cls = javax.validation.Validation.class;
+        } catch (Throwable ignore) {
+        }
+        return cls != null;
+    }
+
     private Class<?> methodClass(String methodName) {
         Class<?> methodClass = null;
         String methodClassName = clazz.getName() + "$" + 
toUpperMethodName(methodName);
diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidatorNew.java
 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidatorNew.java
index 9e6f4017c9..0520fe8290 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidatorNew.java
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/java/org/apache/dubbo/validation/support/jvalidation/JValidatorNew.java
@@ -309,6 +309,16 @@ public class JValidatorNew implements Validator {
         }
     }
 
+    @Override
+    public boolean isSupport() {
+        Class<?> cls = null;
+        try {
+            cls = jakarta.validation.Validation.class;
+        } catch (Throwable ignore) {
+        }
+        return cls != null;
+    }
+
     private Class<?> methodClass(String methodName) {
         Class<?> methodClass = null;
         String methodClassName = clazz.getName() + "$" + 
toUpperMethodName(methodName);
diff --git 
a/dubbo-plugin/dubbo-filter-validation/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
 
b/dubbo-plugin/dubbo-filter-validation/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
index 98ee4f55ac..d082701605 100644
--- 
a/dubbo-plugin/dubbo-filter-validation/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
+++ 
b/dubbo-plugin/dubbo-filter-validation/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
@@ -1,2 +1,3 @@
-jvalidation=org.apache.dubbo.validation.support.jvalidation.JValidation
-jvalidationNew=org.apache.dubbo.validation.support.jvalidation.JValidationNew
\ No newline at end of file
+jvalidation=org.apache.dubbo.validation.support.jvalidation.AdapterValidation
+jvalidation-javax=org.apache.dubbo.validation.support.jvalidation.JValidation
+jvalidation-jakarta=org.apache.dubbo.validation.support.jvalidation.JValidationNew

Reply via email to