首页 > 解决方案 > REST API - 如何创建新的数据类型以简化输入验证

问题描述

在我的应用程序中,我反复使用某些数据类型。例如,我接受多个控制器请求中的电话号码。我不想在我的请求中使用 String 类型并一次又一次地重复相同的@Pattern。相反,我想创建一个电话类型并使用@Valid,电话的类型是字符串,我在这里使用带有电话号码正则表达式的@Pattern。如果请求接受电话号码列表,则客户端应该能够像 '''{ "phoneNumbers": [ "123456789", "123456789" ] }''' 这样传递有可能吗?如果是,电话类型应该是什么样子?

提前致谢。

标签: springrest

解决方案


看看这个库。它包括一个 Jackson 模块来为您处理微类型的反序列化。

在您的场景中,您将创建一个Phone扩展类型MicroType<String>。我认为唯一需要注意的是,您需要为 value 属性提供一个 getter 才能应用验证约束:

@Pattern(...)
protected String getValue() {
    return super.value();
} 

请注意,如果只是重复@Pattern.regex困扰您,另一种解决方案是创建自定义@Phone约束注释:

@Constraint(validatedBy = {})
@Retention(RUNTIME)
@Target(FIELD)
@ReportAsSingleViolation
@Pattern(...)
public @interface Phone {
    String message() default "Invalid phone no";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
} 

推荐阅读