Angular向Spring REST控制器GET请求传递布尔值免转换方案
实现方案
你要的效果完全可以通过框架内置的类型转换能力实现,无需手动处理布尔值和字符串的互转,具体改造如下:
方案1:参数类型自动匹配(推荐)
前端改造
Angular 14及以上版本的HttpParams.set()方法原生支持布尔类型作为入参,框架会自动将布尔值序列化为对应的"true"/"false"字符串拼接到请求参数中,无需手动调用String()转换:
get(include:boolean, dept:string):Observable<EmployeeList>{ let params = new HttpParams(); params=params.set('dept',dept); params=params.set('include',include); // 直接传入布尔值即可,无需手动转字符串 // 补充你原代码遗漏的请求发送逻辑即可 return this.http.get<EmployeeList>('/employee', {params}); }
如果你使用的是Angular 14以下版本,直接传布尔值会触发TS类型警告,只需要给HttpParams的泛型指定为HttpParamsOptions的fromObject模式即可,也不需要手动做字符串转换。
后端改造
Spring MVC内置了请求参数到布尔类型的自动转换器,你只需要把include参数的声明类型改为boolean,框架会自动将请求中传入的"true"/"false"字符串转为对应的布尔值,无需手动调用Boolean.parseBoolean():
@GetMapping(value="/employee") public EmployeeList list(@RequestParam String dept, @RequestParam boolean include) { // 直接使用include变量即可,已经是布尔类型 ............. }
如果需要支持请求不带include参数的场景,可以给参数添加默认值配置:@RequestParam(required = false, defaultValue = "false") boolean include。
方案2:利用参数存在性表示布尔状态
如果你的业务场景符合「勾选才传参数、不勾选不传参数」的语义,也可以用这种更贴合HTTP参数设计的方案:
前端改造
get(include:boolean, dept:string):Observable<EmployeeList>{ let params = new HttpParams().set('dept', dept); if(include) { params = params.set('include', ''); } return this.http.get<EmployeeList>('/employee', {params}); }
后端改造
和方案1一致,Spring会自动识别:参数存在时include为true,不存在时为配置的默认值。
内容的提问来源于stack exchange,提问作者Raman
相关产品推荐
相关产品推荐

