一,应用场景:

Getway网关进行参数校验时,当校验失败时需要返回响应信息,因为Getway基于webFlux实现,需要对返回信息进行封装,如果多个过滤器,这部分代码是重复的,所以抽象出来作为公共部分

实现方式

1,抽象为工具类,我能想到

2,抽象为实现接口,过滤器再实现这个接口,那不还是要在过滤器中实现接口方法,这里不用,可以把公共部分在接口中实现逻辑,用default修饰,实现方法。

在java8以后,接口中可以添加使用default或者static修饰的方法,在这里我们只讨论default方法,default修饰方法只能在接口中使用,在接口种被default标记的方法为普通方法,可以直接写方法体。

二,代码:

1,抽象接口:

/*** 自定义过滤器父类** @author lr* @date 2019-07-26 10:52*/
public interface ParentGatewayFilterFactory {/*** 获取响应信息流** @param exchange* @param responseBean* @return*/default Mono<Void> getFilterResult(ServerWebExchange exchange, ResponseBean responseBean) {ServerHttpResponse response = exchange.getResponse();//或封装响应信息为mapresponse.setStatusCode(HttpStatus.UNAUTHORIZED);Map<String, Object> map = Maps.newHashMap();map.put("errCode", "0001");map.put("errMsg", "参数为空");ObjectMapper objectMapper = new ObjectMapper();try {byte[] bytes = objectMapper.writeValueAsBytes(map);DataBuffer dataBuffer = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(dataBuffer));} catch (JsonProcessingException e) {e.printStackTrace();}response.getHeaders().add("Content-Type", MediaType.APPLICATION_JSON_UTF8_VALUE);response.getHeaders().add("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);return response.writeWith(Mono.just(response.bufferFactory().wrap(JSONObject.toJSONString(responseBean).getBytes(Charset.forName("UTF-8")))));}/*** 根据code设置对应的响应信息** @param code* @param args 参数* @return*/default ResponseBean getResponseBean(String code, Object... args) {String message = MessageFormat.format(PropertiesUtils.getKey(code), args);return ResponseBean.builder().code(code).msg(message).build();}
},2,过滤器调用//判断是否存在
for(SystemParamEnum systemParamEnum : values) {//判读是否有系统参数并且系统参数值不能为空if(!params.containsKey(systemParamEnum.getValue()) && StringUtils.isEmpty(params.get(systemParamEnum.getValue()))) {return getFilterResult(exchange, getResponseBean(systemParamEnum.getErrorCode()));}
}
/*** 校验平台必须参数即系统参数* @author lr* @date 2019-07-26 10:40*/
public class OpenParamGatewayFilterFactoryextends AbstractGatewayFilterFactory<OpenParamGatewayFilterFactory.Config> implements ParentGatewayFilterFactory {/*** 限制时间长度*/private final static long LIMIT_TIME_LONG = 5 * 60 *1000;/*** 重复请求sign秘钥5分钟过期*/private final static long REPEAT_REQUEST_EXPIRE_TIME = 5;@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final static int OPEN_PARAM_FILTER_ORDER = OpenAppInfoGatewayFilterFactory.OPEN_APP_INFO_FILTER_ORDER -1;public OpenParamGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return new OpenParamGatewayFilter();}/*** 内部内的作用,排序,AbstractGatewayFilterFactory实现ordered没效果* 原因:获取过滤器调用apply()返回的GatewayFilter,没有实现Ordered接口,无法排序* 参考org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters(java.lang.String, java.util.List):186行*/public class OpenParamGatewayFilter implements GatewayFilter,Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//校验系统参数MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();Map<String, String> params = queryParams.toSingleValueMap();SystemParamEnum[] values = SystemParamEnum.values();//判断是否存在for(SystemParamEnum systemParamEnum : values) {//判读是否有系统参数并且系统参数值不能为空if(!params.containsKey(systemParamEnum.getValue()) && StringUtils.isEmpty(params.get(systemParamEnum.getValue()))) {return getFilterResult(exchange, getResponseBean(systemParamEnum.getErrorCode()));}}return chain.filter(exchange);}@Overridepublic int getOrder() {return OPEN_PARAM_FILTER_ORDER;}}public static class Config{}
}

抽象实现接口,default修饰接口方法相关推荐

  1. Java1.8接口方法都是抽象_抽象类和接口的区别以及jdk1.8之后接口里面可以实现方法...

    接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象. 当你关注一个事物的本质的时候,用抽象类:当你关注一个操作的时候,用接口. 第一点. 接口可以多继承,抽象类不行 第二点. 接口中, ...

  2. 最全Java各修饰符详解(接口、类、方法、变量)

    一.总述 类.方法.成员变量和局部变量的可用修饰符 修饰符 类 成员访求 构造方法 成员变量 局部变量 abstract(抽象的) √ √ - - - static (静态的) - √ - √ - p ...

  3. 【JAVA】接口中的default和static方法

    接口中方法都为抽象方法. 这句话在JAVA8之前是对的,在JAVA8之后就错了 传统的理解是接口只能是抽象方法.但是程序员们在使用中,发现很不方便,实现接口必须重写所有方法,很麻烦.所以java设计者 ...

  4. java函数式编程之接口Default方法五

    2019独角兽企业重金招聘Python工程师标准>>> 之前看一段java8的代码,发现接口都可以实现方法了,当然在老的教程里面是会告诉我们接口只是定义了方法的,为什么Java8要这 ...

  5. Java接口default方法思考钻石问题

    在多种编程语言中,都会有父类子类的继承关系,但是多继承会存在如下的钻石问题. 来看看钻石: 假如A有一个接口,B,C都有自己的实现,那么继承B和C的D,D的实例赋值给A的引用调用这个接口该返回什么? ...

  6. Java1.8接口方法都是抽象,判断(1分) Java接口中所有的方法都是抽象的。

    判断(1分) Java接口中所有的方法都是抽象的. 更多相关问题 [配伍题,B型题] (1).木瓜(). (2).独活().(3).防己().(4).蕲蛇(). [比较题] (1).质硬不易折断的是( ...

  7. Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)

    1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...

  8. jdk1.8中接口可以写默认方法

    interface Vehicle { default void print(){ System.out.println("我是一辆车!"); } static void blow ...

  9. 【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )

    文章目录 I . 接口总结 II . 接口声明 III . 接口实现 IV . 接口中的方法 V . 接口中的属性 ( 变量 / 常量 ) VI . 接口中的属性属性覆盖 ( 变量 / 常量 ) VI ...

  10. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

最新文章

  1. 由优劣语言之争引起的思考
  2. ios 不支持iframe 解决方案
  3. Git之深入解析如何通过GPG签署和验证工作
  4. 【jQuery】使用id选择器,找出外层div中嵌套的内层div
  5. Linux系统内存管理实验报告,linux内存管理实验报告
  6. 树分解 宽度 如何分解 算法
  7. 【杂项】vmware fusion 流畅度设置
  8. 细粒度分类:Hierarchical Bilinear Pooling(HBP),分级双线性池化(二)
  9. 外卖私域流量:微信社群的运营和羊毛经济
  10. 2018最新4K Ultra HD/UHD视频剪辑/特效合成/调色图形工作站硬件配置
  11. 2021-2-26编程语言知识点整理
  12. 普源精电科创板上市:股价重挫35% 公司市值48亿
  13. GitHub如何使用
  14. Mysql.数据备份
  15. 用 CSS 实现图片的马赛克风格
  16. 4G网络数据传输流程 三
  17. 用OpenSSL做自签名的证书(by quqi99)
  18. 视频建站系统Pocle v2.6 简体中文 GBK
  19. 基于ESP32的智能台灯-PWM网页调光-实时时间-OLED显示-语音闹钟-WEB远程操控
  20. python反转一个三位数的整数_Python学习笔记3-整数反转

热门文章

  1. 使用Outlook Connector插件之后 qq发送过来的邮件为乱码
  2. 几种类型的db,以及最新的db排名,看一下
  3. CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法2
  4. Webgoat学习笔记1
  5. 如何使页面POSTBACK后,仍然显示原来的显示位置
  6. 深入解读Linux进程调度系列(1)——调度的初始化
  7. 从海康7816的ps流里获取数据h264数据
  8. MotionEstimate运动估计综述
  9. session timer(一)
  10. 同余方程-NOIP2012TGD2T1