使用jfinal-routebind出现bug导致修改代码后jetty无法正常重启


问题描述:

项目开始启动的时候,没问题。


修改代码后jetty启动报错,说是ActionKey已经存在了,检查后发现,RouteBind类的config()中。

List<Class<? extends Controller>> controllerClasses = ClassSearchKit.of(Controller.class)
.includepaths(includeClassPaths).search();

问题出在这段代码。

debug进去WebAppClassLoader类中的getResources()方法里面。发现。

使用jfinal-routebind出现bug导致修改代码后jetty无法正常重启_第1张图片

classes路径保存了两个一样的,导致后面扫描的时候,class文件保存了两份。

进入ClassSearchKit 类里面查看search()方法

return extraction(target, classFileList);

这个方法返回了最终的classFileList。

启动时:

使用jfinal-routebind出现bug导致修改代码后jetty无法正常重启_第2张图片

修改代码重启时:

使用jfinal-routebind出现bug导致修改代码后jetty无法正常重启_第3张图片

classFileList中每个controller都重复了。

所以,写一个工具类,将生成的list中,重复的Controller去掉就可以了。

public class CollectionKit {
    
    public static List<Class<? extends Controller>> removeDuplicate(List<Class<? extends Controller>> list){
        HashSet<Class<? extends Controller>> h = new HashSet<Class<? extends Controller>>(list);
        list.clear();
        list.addAll(h);
        return list;
    }
}

之后RouteBind类的config()方法掉调用一下就可以了。

public void config() {
        List<Class<? extends Controller>> controllerClasses = ClassSearchKit
            .of(Controller.class).includepaths(includeClassPaths).search();
        controllerClasses=CollectionKit.removeDuplicate(controllerClasses);
        
        ControllerKey controllerKey = null;
        ……
        ……

问题解决。

你可能感兴趣的:(jFinal)