JSR303使用技巧--注解方式校验传参

JSR303

一、使用方法

1.引入依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-validation</artifactId>
     <version>2.0.0.RELEASE</version>
 </dependency>

2.在需要验证的函数前加valid注解

public Result<CodeMsg> doLogin(@Valid LoginVo loginVo)

3.在需要校验类中加入需要校验的注解

public class LoginVo {
    @NotNull
    private String mobile;

    @NotNull
    @Length(min = 32)
    private String password;
}

二、拓展

1.自带支持的校验方法

hibernate校验类中
hibernate校验类中

2.拓展校验方法

创建一个注解

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {IsMobileValidator.class}
)//添加校验器
public @interface IsMobile {

    boolean required() default true;//自增

    String message() default "手机号码格式错误";//出错提示信息

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

在校验器中校验,实现ConstraintValidator接口

public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {

    boolean required;
    @Override
    public void initialize(IsMobile isMobile) {
        required=isMobile.required();
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if(required){
            return ValidateUtil.isMobile(s);
        }else{
            if(StringUtils.isEmpty(s)){
                return true;
            }else{
                return ValidateUtil.isMobile(s);
            }
        }
    }
}

将IsMobile注解放到需要校验的属性上

@NotNull
@IsMobile
private String mobile;
<think>嗯,用户问的是传参注解有哪些,这应该是在编程中,特别是在处理参数传递时使用注解。我需要先确定用户指的是哪种编程语言。因为不同的语言有不同的注解方式,比如Java有Spring框架的注解,Python有FastAPI或Flask的装饰器,还有TypeScript中的参数装饰器。 首先,用户可能没有明确说明语言,但根据常见的“传参注解”这个术语,可能指的是Web开发中的参数传递,比如在Spring Boot中的@RequestParam、@PathVariable,或者Python的FastAPI中的Query、Path等。也有可能用户指的是函数参数的类型注解,比如Python的类型提示。 需要先确认常见的几种框架中的传参注解,然后分门别类介绍。比如在Java Spring中,处理HTTP请求参数的注解,或者Python中FastAPI的参数验证注解。另外,可能还需要提到其他语言或框架中的类似机制,比如JavaScript/TypeScript中的装饰器,或者.NET中的属性注解。 另外,用户可能想了解这些注解的作用、使用场景以及示例。需要给出每个注解的简要说明,例如@RequestParam用于获取查询参数,@PathVariable获取URL路径中的变量,@RequestBody处理POST请求的JSON数据等。 还要注意不同注解的区别,比如在Spring中,@RequestParam和@PathVariable的区别在于参数来源的位置不同。而在FastAPI中,Query和Path是用来定义参数类型和验证规则的。同时,可能还需要提到一些参数校验注解,比如@Valid用于验证对象,或者JSR-303中的@NotNull、@Size等。 需要注意的是,用户可能对注解的具体用法不太清楚,所以每个注解最好附带一个简单的代码示例,这样更直观。例如,在Spring中,一个Controller方法使用@PathVariable来获取路径参数,或者FastAPI中定义路径操作函数时使用Query参数。 另外,可能需要考虑用户的实际应用场景,比如在RESTful API开发中如何处理不同类型的参数传递,或者如何通过注解进行参数校验和类型转换。这时候,除了列举注解,还需要解释它们的作用和使用方法,帮助用户更好地理解和应用。 最后,总结不同框架中的传参注解,并建议用户根据自己使用的技术栈选择相应的注解,同时注意注解的具体配置选项和最佳实践。这样用户能够根据实际情况找到合适的解决方案,并正确使用这些注解来处理参数传递问题。</think>在编程中,“传参注解”通常指用于标记或处理函数/方法参数的特定注解或装饰器,不同编程语言和框架的实现方式不同。以下是常见场景下的传参注解分类及说明: --- ### 一、Java Spring 框架 用于处理 HTTP 请求参数: 1. **`@RequestParam`** 从 URL 查询参数中获取值。 ```java public String getUser(@RequestParam("id") String userId) { ... } ``` 2. **`@PathVariable`** 从 URL 路径中获取动态参数。 ```java @GetMapping("/user/{id}") public String getUser(@PathVariable("id") String id) { ... } ``` 3. **`@RequestBody`** 接收请求体中的 JSON/XML 数据并反序列化为对象。 ```java public User createUser(@RequestBody User user) { ... } ``` 4. **`@ModelAttribute`** 绑定请求参数到对象属性(常用于表单提交)。 ```java public String submitForm(@ModelAttribute User user) { ... } ``` --- ### 二、Python FastAPI 框架 用于定义请求参数的验证和文档生成: 1. **`Query`** 定义查询参数的类型和校验规则。 ```python def read_items(q: str = Query(None, min_length=3)): ... ``` 2. **`Path`** 定义路径参数的校验规则。 ```python def read_item(item_id: int = Path(..., title="The ID of the item")): ... ``` 3. **`Body`** 标记参数来自请求体(如 JSON)。 ```python def update_item(item: Item = Body(...)): ... ``` 4. **`Form`** 和 **`File`** 处理表单数据或文件上传。 ```python def login(username: str = Form(...), password: str = Form(...)): ... ``` --- ### 三、TypeScript(NestJS 框架) 1. **`@Query()`** 获取 URL 查询参数。 ```typescript getUsers(@Query('name') name: string) { ... } ``` 2. **`@Param()`** 获取路径参数。 ```typescript @Get(':id') getUser(@Param('id') id: string) { ... } ``` 3. **`@Body()`** 获取请求体数据。 ```typescript createUser(@Body() user: UserDto) { ... } ``` --- ### 四、通用参数校验注解 用于参数合法性验证: 1. **JSR-303 规范(Java)** - `@NotNull`:参数不能为 null - `@Size(min=1, max=10)`:字符串/集合长度限制 - `@Email`:校验邮箱格式 2. **Python Pydantic** 通过类型提示实现参数校验: ```python class Item(BaseModel): name: str price: float = Field(..., gt=0) # 必须大于0 ``` --- ### 五、其他场景 - **Kotlin(Ktor 框架)** `@QueryParam`, `@PathParam` 等处理请求参数。 - **.NET Core** 使用 `[FromQuery]`, `[FromRoute]`, `[FromBody]` 等属性标记参数来源。 --- ### 总结 传参注解的核心作用: 1. **明确参数来源**(路径、查询、请求体等) 2. **自动类型转换**(如字符串转数字) 3. **参数校验**(格式、范围、必填性) 4. **生成 API 文档**(如 Swagger 自动描述参数) 根据具体框架选择对应的注解,可显著简化参数处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值