java 仅限字符串数字和字符

qgelzfjb  于 2023-01-19  发布在  Java
关注(0)|答案(4)|浏览(145)

我有ContactDTO类,私有的ContactType联系人类型;(这是枚举、电子邮件、电话号码)私有字符串contactvalue;私有长学生ID;我想在创建新联系人时编写方法,如果person使用PHONENUMBER枚举字符串contactvalue只能是数字,如果person使用EMAIL枚举,它也可以是字符

ac1kyiln

ac1kyiln1#

您可以编写一个接受枚举和值并基于枚举检查值的方法。
事情可以这么简单:

public void setContact(ContactType type, String value) {
  //check the value first
  switch(type) {
    case PHONENUMBER: {
      if( !StringUtils.isNumeric(value) ) {
        throw new IllegalArgumentException("phone number must be numeric");
      }
      break;
    }
    case EMAIL: {
      //note: emails contain more than just numbers and alphabetic chars
      if( !StringUtils.isAlphanumeric(value) ) {
        throw new IllegalArgumentException("email must be alphanumeric");
      }
      break;
    }
  }

   this.value = value;
}

但是,您可能需要更多类型或更复杂的类型,因此可以尝试使用正则表达式(对于许多简单情况,“手动”创建的规则速度更快,但需要更复杂的设计):

enum ContactType {
   PHONENUMBER("\\d+"),
   EMAIL(/*pattern for email*/);

   Pattern pattern;

   private ContactType(String regex) {
     pattern = Pattern.compile(regex);
   }

   public void validateInput(String input) {
     if(!pattern.matcher(input).matches()) {
        throw new IllegalArgumentException("input invalid");
     }
   }
 }

并设置该值:

public void setContact(ContactType type, String value) {
   type.validateInput(value);

   this.value = value;
 }
zd287kbt

zd287kbt2#

ContactType应该是一个包含电子邮件、电话号码等字段的类,然后你可以验证你想要的每个字段。

wswtfjt7

wswtfjt73#

问题中确实没有太多的细节。既然你用"spring-boot"标记了这个问题,我想我们讨论的是(javax|jakarta).validation.的东西吧?在这种情况下,你可以使用类级验证。
一些片段:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ContactTypeValidator.class)
public @interface ContactTypeValid {
 
    String message() default "contact value invalid for specified type";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
 
}
public class ContactTypeValidator implements ConstraintValidator<ContactTypeValid, ContactDTO> {
 
    @Override
    public void initialize(ContactTypeValid constraint) {
    }
 
    @Override
    public boolean isValid(ContactDTO contactDTO, ConstraintValidatorContext context) {
        // put your logic here. e.g.
        
        // deal with possible nulls

        if(PHONENUMBER == contactDTO.getContacttype()) {
          return contactDTO.getContactvalue().chars().allMatch(Character::isDigit);
        }
        return true;
    }
}
@RestController
class MyController {

  @PostMapping("/api/contact")
  void postContact(@Valid ContactDTO contactDTO) {
    ...
  }
  

}

注解您的ContactDTO:

@ContactTypeValid
public class ContactDTO {
  ...
}

您还需要在依赖项中实现验证,如spring-boot-starter-validation
Spring文档获取更多信息:www.example.comhttps://docs.spring.io/spring-framework/docs/current/reference/html/core.html#validation-beanvalidation
和好点从@М г о р ь-Şо д ы к о.使用单独的字段.

tkqqtvp1

tkqqtvp14#

如果您只需要一个数字验证器:

enum ContactEnum {EMAIL, PHONENUMBER}
      private boolean validatePhoneNumber(ContactEnum type, String contactString) {
    
        if (type == ContactEnum.PHONENUMBER) {
          return contactString.chars().filter(Character::isDigit).count() == contactString.length();
        }
        return false;
      }

相关问题