SpringMvc接口中转设计(策略+模板方法)

一、前言

  最近带着两个兄弟做支付宝小程序后端相关的开发,小程序首页涉及到很多查询的服务。小程序后端服务在我司属于互联网域,相关的查询服务已经在核心域存在了,查询这块所要做的工作就是做接口中转。参考了微信小程序的代码,发现他们要么新写一个接口调用,要么新写一个接口包裹多个接口调用。这种方式不容易扩展。由于开发周期比较理想,所以决定设计一个接口中转器。

二、接口中转器整体设计

  

 

三、接口中转器核心Bean

@Bean
public SimpleUrlHandlerMapping directUrlHandlerMapping(@Autowired RequestMappingHandlerAdapter handlerAdapter
        , ObjectProvider<List<IDirectUrlProcessor>> directUrlProcessorsProvider) {
    List<IDirectUrlProcessor> directUrlProcessors = directUrlProcessorsProvider.getIfAvailable();
    Assert.notEmpty(directUrlProcessors, "接口直达解析器(IDirectUrlProcessor)列表不能为空!!!");
    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
    Map<String, Controller> urlMappings = Maps.newHashMap();
    urlMappings.put("/alipay-applet/direct/**", new AbstractController() {
        @Override
        protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
            for (IDirectUrlProcessor directUrlProcessor : directUrlProcessors) {
                if (directUrlProcessor.support(request)) {
                    String accept = request.getHeader("Accept");
                    request.setAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Sets.newHashSet(MediaType.APPLICATION_JSON_UTF8));
                    if (StringUtils.isNotBlank(accept) && !accept.contains(MediaType.ALL_VALUE)) {
                        request.setAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Sets.newHashSet(
                                Arrays.stream(accept.split(","))
                                        .map(value -> MediaType.parseMediaType(value.trim()))
                                        .toArray(size -> new MediaType[size])
                        ));
                    }
                    HandlerMethod handlerMethod = new HandlerMethod(directUrlProcessor, ReflectionUtils.findMethod(IDirectUrlProcessor.class, "handle", HttpServletRequest.class));
                    return handlerAdapter.handle(request, response, handlerMethod);
                }
            }
            throw new RuntimeException("未找到具体的接口直达处理器...");
        }
    });
    mapping.setUrlMap(urlMappings);
    mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
    return mapping;
}

  关于核心Bean的示意如下。

  • 使用S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值