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);
    }
}

 

以上例子为参数转换为枚举类型,转换为实体对象也可以,具体规则以业务需求为主。

个人认为,此写法虽然简单,但是代码可读性不高,最好在代码注释中加以说明!!!

posted @ 2021-07-13 17:07  hjjsunli  阅读(544)  评论(0编辑  收藏  举报