抽象实现接口,default修饰接口方法
一,应用场景:
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修饰接口方法相关推荐
- Java1.8接口方法都是抽象_抽象类和接口的区别以及jdk1.8之后接口里面可以实现方法...
接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象. 当你关注一个事物的本质的时候,用抽象类:当你关注一个操作的时候,用接口. 第一点. 接口可以多继承,抽象类不行 第二点. 接口中, ...
- 最全Java各修饰符详解(接口、类、方法、变量)
一.总述 类.方法.成员变量和局部变量的可用修饰符 修饰符 类 成员访求 构造方法 成员变量 局部变量 abstract(抽象的) √ √ - - - static (静态的) - √ - √ - p ...
- 【JAVA】接口中的default和static方法
接口中方法都为抽象方法. 这句话在JAVA8之前是对的,在JAVA8之后就错了 传统的理解是接口只能是抽象方法.但是程序员们在使用中,发现很不方便,实现接口必须重写所有方法,很麻烦.所以java设计者 ...
- java函数式编程之接口Default方法五
2019独角兽企业重金招聘Python工程师标准>>> 之前看一段java8的代码,发现接口都可以实现方法了,当然在老的教程里面是会告诉我们接口只是定义了方法的,为什么Java8要这 ...
- Java接口default方法思考钻石问题
在多种编程语言中,都会有父类子类的继承关系,但是多继承会存在如下的钻石问题. 来看看钻石: 假如A有一个接口,B,C都有自己的实现,那么继承B和C的D,D的实例赋值给A的引用调用这个接口该返回什么? ...
- Java1.8接口方法都是抽象,判断(1分) Java接口中所有的方法都是抽象的。
判断(1分) Java接口中所有的方法都是抽象的. 更多相关问题 [配伍题,B型题] (1).木瓜(). (2).独活().(3).防己().(4).蕲蛇(). [比较题] (1).质硬不易折断的是( ...
- Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)
1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...
- jdk1.8中接口可以写默认方法
interface Vehicle { default void print(){ System.out.println("我是一辆车!"); } static void blow ...
- 【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )
文章目录 I . 接口总结 II . 接口声明 III . 接口实现 IV . 接口中的方法 V . 接口中的属性 ( 变量 / 常量 ) VI . 接口中的属性属性覆盖 ( 变量 / 常量 ) VI ...
- Java8新特性Optional、接口中的默认方法与静态方法
Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...
最新文章
- 由优劣语言之争引起的思考
- ios 不支持iframe 解决方案
- Git之深入解析如何通过GPG签署和验证工作
- 【jQuery】使用id选择器,找出外层div中嵌套的内层div
- Linux系统内存管理实验报告,linux内存管理实验报告
- 树分解 宽度 如何分解 算法
- 【杂项】vmware fusion 流畅度设置
- 细粒度分类:Hierarchical Bilinear Pooling(HBP),分级双线性池化(二)
- 外卖私域流量:微信社群的运营和羊毛经济
- 2018最新4K Ultra HD/UHD视频剪辑/特效合成/调色图形工作站硬件配置
- 2021-2-26编程语言知识点整理
- 普源精电科创板上市:股价重挫35% 公司市值48亿
- GitHub如何使用
- Mysql.数据备份
- 用 CSS 实现图片的马赛克风格
- 4G网络数据传输流程 三
- 用OpenSSL做自签名的证书(by quqi99)
- 视频建站系统Pocle v2.6 简体中文 GBK
- 基于ESP32的智能台灯-PWM网页调光-实时时间-OLED显示-语音闹钟-WEB远程操控
- python反转一个三位数的整数_Python学习笔记3-整数反转