20201029 Tomcat与JDK的版本兼容问题

Tomcat7只支持jdk1.7及以下,若是jdk1.8则需要用tomcat8及以上,否则可能会报错,比如default关键字的使用。

现象:war包本地运行没问题,一到uat环境启动就报错。继承Filter时,因为init(),destroy()有关键字default修饰,没有重写。

@Slf4j
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ForwardFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String url = request.getRequestURL().toString();
        //健康检测地址不转发
        if (!url.contains("README/release_note")) {
            log.info("source url:" + url);
            String descUrl = transformToDescUrl(url);
            log.info("desc url:" + descUrl);
            ///yutaiappapidev/admin/css/pages/login1.css
            try {
                request.getRequestDispatcher(descUrl).forward(request, response);//重新走ZUUL,进入网关流程
            } catch (Exception e) {
                e.printStackTrace();
                log.info("error: " + e.getMessage());
            }
        }
    }
}

本地tomcat插件是1.9版本,启动时没有报错;但是uat环境tomcat是1.7版本,不支持jdk1.8的关键字,所以每次启动都会报:filterStart Exception starting filter java.lang.AbstractMethodError 抽象方法错误。

解决方案是重写init()方法和destroy()方法

所以要注意tomcat与jdk的版本兼容问题

 

default关键字

在JDK1.8中,接口中的方法可以有方法体,但需要关键字default来修饰,使用default来修饰的称之为默认方法,默认方法通过实例对象来调用。

默认方法有自己的方法体,用于提供一套默认的实现,这样子类对于该方法就不需要强制来实现(可以不用强制实现),可以选择使用默认的实现,也可以重写自己的实现。当为接口扩展方法时,只需要提供该方法的默认实现即可,至于对应的实现类可以重写也可以使用默认的实现,这样所有的实现类不会报语法错误:Xxx不是抽象的, 并且未覆盖Yxx中的抽象方法。

default关键字可以让接口中的方法可以有默认的方法体,当一个类实现这个接口时,可以不用去实现这个方法。

public interface Default {
    
    //接口中的方法可以有方法体
    default void method(){
        System.out.println("method in interface");
    }
}
public class DefaultImpl implements Default {
    @Override
    public void method() {
        System.out.println("method in DefaultImpl");
    }
}
public class TestDefault {
    public static void main(String[] args) {
        //1,DefaultImpl子类可以不实现有default修饰的方法,但是在tomcat中会报错。
        //DefaultImpl aDefault = new DefaultImpl();
        //aDefault.method();

        //2,如果子类重写接口中default修饰的方法,则调用自己的方法
        DefaultImpl aDefault = new DefaultImpl();
        aDefault.method();
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值