Restful API 参数类型转换
随着Web系统前后端分离,越来越多的Restful接口在编写,这样也就涉及到一个问题,在接口调用的过程中,接口始终保持着参数传参的“原汁原味”。
现在,当前端调用API接口时,接口并不想仅拿到前端传来的简单(原始)参数,而想通过参数的规律获取到某个对象。一般的做法很简单,
就是写一个私有的转换方法,或者写一个工具方法,但是这些都是在接口内部实现的,当多个接口都需要此功能时,就要多处调用,代码重复性就提高了。
现在给大家介绍另一种方法,在接收参数时进行转换。
API接口与普通接口相同
@ResponseBody @GetMapping("/convertParam") public String convertParam(@RequestParam TableType tableType) { return tableType.name(); } public enum TableType { TABLE_A, TABLE_B, TABLE_C; }
在配置类中新建 SpringDataConvert.java
@Configuration public class SpringDataConvert { @Autowired private RequestMappingHandlerAdapter requestMappingHandlerAdapter; @PostConstruct public void addConversionConfig() { ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) requestMappingHandlerAdapter.getWebBindingInitializer(); if (initializer.getConversionService() != null) { GenericConversionService genericConversionService = (GenericConversionService) initializer.getConversionService(); genericConversionService.addConverter(new ConvertStringToEnum()); } } }
实现参数转换类,并加入到SpringDataConvert中
@Component public class ConvertStringToEnum implements Converter<String, TestController.TableType> { @Override public TestController.TableType convert(String source) { return Arrays.asList(TestController.TableType.values()).stream() .filter(tableType -> tableType.ordinal() == Integer.parseInt(source)).findFirst().orElse(TestController.TableType.TABLE_A); } }
以上例子为参数转换为枚举类型,转换为实体对象也可以,具体规则以业务需求为主。
个人认为,此写法虽然简单,但是代码可读性不高,最好在代码注释中加以说明!!!