在配置文件中定义了Timbetween所以我们需要新建一个predicateFactory来进行自定义配置
新建一个TimeBetweenPredicateFactory(“TimeBetween”+“PredicateFactory”-》只有这样才能配解析)
package com.itmuch.gateway; import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @Component public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<TimeBetweenConfig> { public TimeBetweenRoutePredicateFactory() { super(TimeBetweenConfig.class); } @Override public Predicate<ServerWebExchange> apply(TimeBetweenConfig config) { LocalTime start = config.getStart(); LocalTime end = config.getEnd(); return exchange->{ LocalTime now = LocalTime.now(); return now.isAfter(start) && now.isBefore(end); }; } @Override public List<String> shortcutFieldOrder() { return Arrays.asList("start","end"); } public static void main(String[] args) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT); System.out.println(dateTimeFormatter.format(LocalTime.now())); } }
继承
AbstractRoutePredicateFactory<>
需要用到泛型,这里的泛型是需要定义一个配置类来给配置参数,下面是配置类,配置开始时间和结束时间
package com.itmuch.gateway; import lombok.Data; import java.time.LocalTime; @Data public class TimeBetweenConfig { private LocalTime start; private LocalTime end; }
在TimeBetweenPredicateFactory中重写的
@Override public List<String> shortcutFieldOrder() { return Arrays.asList("start","end"); }
用来映射参数,asList("配置文件的第1个参数","配置文件的第2个参数","配置文件的第3个参数","配置文件的第4个参数"....),接给配置类,配置类得到参数后里面的参数有值然后在重写的
@Override public Predicate<ServerWebExchange> apply(TimeBetweenConfig config) { LocalTime start = config.getStart(); LocalTime end = config.getEnd(); return exchange->{ LocalTime now = LocalTime.now(); return now.isAfter(start) && now.isBefore(end); }; }
中进行谓词配置,实现自定义谓词工厂
根据java8新特性,可以查看这里时间格式
public static void main(String[] args) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT); System.out.println(dateTimeFormatter.format(LocalTime.now())); }