diff --git a/common/build.gradle b/common/build.gradle
index 3347b79..dcfba9e 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -8,9 +8,16 @@
     implementation 'javax.validation:validation-api:2.0.1.Final'
     implementation 'javax.servlet:javax.servlet-api:4.0.1'
     implementation 'commons-beanutils:commons-beanutils:1.9.3'
+    implementation('org.springframework.boot:spring-boot-starter-validation:2.1.6.RELEASE')
+
+    implementation 'org.hibernate:hibernate-validator:6.0.2.Final'
+    compile 'javax.el:javax.el-api:3.0.0'
+    compile 'org.glassfish.web:javax.el:2.2.6'
 
     compileOnly 'org.projectlombok:lombok:1.18.8'
     annotationProcessor 'org.projectlombok:lombok:1.18.8'
 
     implementation 'org.apache.commons:commons-lang3:3.9'
+
+    testImplementation 'junit:junit:4.12'
 }
\ No newline at end of file
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/annotation/Sex.java b/common/src/main/java/com/supwisdom/dlpay/api/annotation/Sex.java
index 4697807..44fb69e 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/annotation/Sex.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/annotation/Sex.java
@@ -1,12 +1,14 @@
 package com.supwisdom.dlpay.api.annotation;
 
-import com.supwisdom.dlpay.api.validator.StatusValidator;
+import com.supwisdom.dlpay.api.util.SexTypes;
+import com.supwisdom.dlpay.api.validator.SexValidator;
+import com.supwisdom.dlpay.api.validator.UserStatusValidator;
 
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.*;
 
-@Constraint(validatedBy = {StatusValidator.class})
+@Constraint(validatedBy = {SexValidator.class})
 @Documented
 @Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
 @Retention(RetentionPolicy.RUNTIME)
@@ -16,4 +18,6 @@
   Class<?>[] groups() default {};
 
   Class<? extends Payload>[] payload() default {};
+
+  SexTypes value() default SexTypes.ALL;
 }
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/annotation/UserStatus.java b/common/src/main/java/com/supwisdom/dlpay/api/annotation/UserStatus.java
index 3b034fb..bbfbc6d 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/annotation/UserStatus.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/annotation/UserStatus.java
@@ -1,15 +1,15 @@
 package com.supwisdom.dlpay.api.annotation;
 
 
-import com.supwisdom.dlpay.api.validator.StatusValidator;
+import com.supwisdom.dlpay.api.validator.UserStatusValidator;
 
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.*;
 
-@Constraint(validatedBy = {StatusValidator.class})
+@Constraint(validatedBy = {UserStatusValidator.class})
 @Documented
-@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
+@Target({ElementType.METHOD, ElementType.FIELD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface UserStatus {
   String message() default "不正确的状态 , 应该是 'open', 'closed', 'losed' 其中之一";
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java
index 79c5160..5b0e7dc 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java
@@ -7,8 +7,8 @@
 import lombok.Getter;
 import lombok.Setter;
 
-import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
 import java.util.List;
 
 @Getter
@@ -23,8 +23,8 @@
   private String shopaccno;
 
   @Sign
-  @NotNull
-  @Min(value = 0L, message = "交易金额必须大于零")
+  @NotNull(message = "交易金额不能为空")
+  @Positive(message = "交易金额必须大于零")
   private Integer amount;
 
   private List<ConsumeFeetype> feelist;
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/util/SexTypes.java b/common/src/main/java/com/supwisdom/dlpay/api/util/SexTypes.java
new file mode 100644
index 0000000..380110f
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/util/SexTypes.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.api.util;
+
+public enum SexTypes {
+  MALE("male"),
+  FEMALE("female"),
+  UNKNOWN("unknown"),
+  ALL(new SexTypes[]{MALE, FEMALE, UNKNOWN});
+
+  SexTypes(Object data) {
+    this.data = data;
+  }
+
+  public String value() {
+    return this.data.toString();
+  }
+
+  public Object getData() {
+    return this.data;
+  }
+
+  private Object data;
+}
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/validator/MobileNumberValidator.java b/common/src/main/java/com/supwisdom/dlpay/api/validator/MobileNumberValidator.java
index 0be737f..8fc1a26 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/validator/MobileNumberValidator.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/validator/MobileNumberValidator.java
@@ -10,6 +10,9 @@
 
   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
+    if (value == null) {
+      return true;
+    }
     return MobileNumberCheck.isPhone(value);
   }
 
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/validator/SexValidator.java b/common/src/main/java/com/supwisdom/dlpay/api/validator/SexValidator.java
index 5a38bb4..22aba88 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/validator/SexValidator.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/validator/SexValidator.java
@@ -2,21 +2,31 @@
 
 
 import com.supwisdom.dlpay.api.annotation.Sex;
+import com.supwisdom.dlpay.api.util.SexTypes;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
-import java.util.Collections;
+import java.util.Arrays;
 
 
 public class SexValidator implements ConstraintValidator<Sex, String> {
-  private final String[] ALL_TYPE = {"male", "female", "unknown"};
+  private String[] sexTypes;
 
   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
-    return Collections.singletonList(ALL_TYPE).contains(value);
+    return Arrays.asList(sexTypes).contains(value);
   }
 
   @Override
   public void initialize(Sex constraintAnnotation) {
+    if (constraintAnnotation.value().getData() instanceof SexTypes[]) {
+      SexTypes[] arrays = (SexTypes[]) constraintAnnotation.value().getData();
+      sexTypes = new String[arrays.length];
+      for (int i = 0; i < arrays.length; i++) {
+        sexTypes[i] = arrays[i].value();
+      }
+    } else {
+      sexTypes = new String[]{constraintAnnotation.value().value()};
+    }
   }
 }
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/validator/StatusValidator.java b/common/src/main/java/com/supwisdom/dlpay/api/validator/UserStatusValidator.java
similarity index 86%
rename from common/src/main/java/com/supwisdom/dlpay/api/validator/StatusValidator.java
rename to common/src/main/java/com/supwisdom/dlpay/api/validator/UserStatusValidator.java
index 84b8e5b..b124f65 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/validator/StatusValidator.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/validator/UserStatusValidator.java
@@ -6,7 +6,7 @@
 import javax.validation.ConstraintValidatorContext;
 import java.util.Arrays;
 
-public class StatusValidator implements ConstraintValidator<UserStatus, String> {
+public class UserStatusValidator implements ConstraintValidator<UserStatus, String> {
   private final String[] ALL_STATUS = {"open", "closed", "losed"};
 
   @Override
diff --git a/common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java b/common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java
new file mode 100644
index 0000000..f39af2e
--- /dev/null
+++ b/common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java
@@ -0,0 +1,47 @@
+package com.supwisdom.dlpay.api.bean;
+
+import org.junit.Test;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import java.util.Set;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class CitizenCardPayinitParamTest {
+
+  private Validator validator;
+
+  @org.junit.Before
+  public void setUp() throws Exception {
+    ValidatorFactory factor = Validation.buildDefaultValidatorFactory();
+    validator = factor.getValidator();
+  }
+
+  @Test
+  public void testCitizenPay() {
+    CitizenCardPayinitParam param = new CitizenCardPayinitParam();
+
+    Set<ConstraintViolation<CitizenCardPayinitParam>> violations = validator.validate(param);
+    StringBuilder message = new StringBuilder();
+    for (ConstraintViolation<CitizenCardPayinitParam> item : violations) {
+      message.append(item.getMessage()).append("\n");
+    }
+    assertFalse(message.toString(), violations.isEmpty());
+  }
+
+  @Test
+  public void testOpenUserParam() {
+    OpenUserParam param = new OpenUserParam();
+    param.setIdtype("12323");
+    Set<ConstraintViolation<OpenUserParam>> violations = validator.validate(param);
+    StringBuilder message = new StringBuilder();
+    for (ConstraintViolation<OpenUserParam> item : violations) {
+      message.append(item.getMessage()).append("\n");
+    }
+    assertFalse(message.toString(), violations.isEmpty());
+  }
+}
\ No newline at end of file
