面试题答案
一键面试设计通用且高效接口参数校验机制的思路
- 定义校验规则:
- 基于注解:使用注解方式为不同参数定义校验规则。例如,对于简单类型参数,可以通过
@NotNull
注解确保参数不为空,@Pattern
注解用于校验参数格式,如邮箱、手机号等。对于复杂对象,可以在对象内部字段上使用注解,如对于一个包含年龄字段的用户对象,可在年龄字段上使用@Min(18)
确保年龄不小于18岁。 - 配置文件:对于一些通用且需要动态调整的校验规则,可以放在配置文件中。比如某些业务场景下订单金额的最大最小值限制,可在配置文件中定义,这样在不修改代码的情况下就能调整规则。
- 基于注解:使用注解方式为不同参数定义校验规则。例如,对于简单类型参数,可以通过
- 校验逻辑实现:
- 统一校验处理器:创建一个通用的校验处理器,在接收到请求后,根据请求参数上的注解或配置文件中的规则进行校验。可以使用反射机制获取参数的注解信息,然后执行相应的校验逻辑。例如,获取到
@NotNull
注解后,判断参数是否为null
。 - 分层校验:对于复杂对象和数组,采用分层校验。对于复杂对象,先校验对象本身是否为
null
,然后递归校验对象内部字段。对于数组,遍历数组元素并对每个元素进行相应的校验,如数组元素为复杂对象,同样进行递归校验。
- 统一校验处理器:创建一个通用的校验处理器,在接收到请求后,根据请求参数上的注解或配置文件中的规则进行校验。可以使用反射机制获取参数的注解信息,然后执行相应的校验逻辑。例如,获取到
- 错误处理与反馈:
- 统一错误码:定义一套统一的错误码体系,每个校验失败场景对应一个唯一的错误码。例如,参数为空的错误码为
1001
,参数格式错误的错误码为1002
等。这样在客户端可以根据错误码快速定位问题。 - 详细错误信息:除了错误码,返回详细的错误信息,告知用户具体是哪个参数校验失败以及失败原因。比如“参数
name
不能为空”。
- 统一错误码:定义一套统一的错误码体系,每个校验失败场景对应一个唯一的错误码。例如,参数为空的错误码为
可能用到的技术或工具
- Java Bean Validation(JSR 380):这是Java标准的验证框架,提供了一系列注解(如
@NotNull
、@Size
等)用于参数校验,同时也支持自定义校验注解和校验器。可以方便地集成到基于Java的微服务框架(如Spring Boot)中。 - Hibernate Validator:是JSR 380的参考实现,功能强大,支持各种复杂的校验场景,包括跨字段、跨对象的校验。例如,可以通过自定义校验器实现两个日期字段先后顺序的校验。
- JSON Schema:如果微服务接口使用JSON进行数据传输,可以使用JSON Schema定义JSON数据的结构和校验规则。它可以校验JSON对象的字段、类型、数组元素等。许多编程语言都有相应的JSON Schema校验库,如JavaScript中的
ajv
,Java中的json-schema-validator
。 - Aspect - Oriented Programming(AOP):在Java中,可以利用AOP技术将校验逻辑从业务代码中分离出来,通过切面在方法调用前后进行参数校验。这样可以减少业务代码中的校验逻辑,提高代码的可维护性和复用性。例如,定义一个切面类,在方法调用前获取方法参数并进行校验。