从1.8升级到3.4,现在项目启动没问题,但是访问jsp报错

java.lang.AbstractMethodError: com.rose.interceptors.BasePathInterceptor.intercept(Lcom/jfinal/core/ActionInvocation;)V

at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)

at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)

at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:47)

at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:748)

不知道该从哪入手。

评论区

JFinal

2018-06-14 11:11

升级的幅度挺大,一定要按升级文档来:
http://www.jfinal.com/doc/14-1

异常是 AbstractMethodError, 明显是方法名不对引起的,jfinal 后续版本的方法名有几个改动,升级的时候先 clean 一下所有,然后重新编译一下,让 eclipse 帮着检查哪些地方有方法签名的错误,分分钟就改掉了

704535983

2018-06-14 11:15

@JFinal 波总,我这没有任何错...项目都能正常启动。但是访问jsp就报这个错。我在访问的ctrl里加了这个拦截器

JFinal

2018-06-14 11:49

@704535983 新版本的 jfinal 默认引擎是 enjoy,你得配置成 JSP:
me.setViewType(ViewType.JSP);

704535983

2018-06-14 12:17

@JFinal 波总,在1.8的时候,config类中的configConstant方法,里我就是arg0.setViewType(ViewType.JSP);这么设置的

JFinal

2018-06-14 12:40

@704535983 仔细看了一下,你的 BasePathInterceptor 中使用的 ActionInvocation 应该改成 Invocation

类名有变化,而且这个类从 core 包转移到了 aop 包,这个应该是 eclipse 会提示你错误的,难道是你的 BasePathInterceptor 放在另一个 jar 包中的,如果是的话,需要先升级另一个 jar 包到 jfinal 3.4

704535983

2018-06-14 12:59

@JFinal public class BasePathInterceptor implements Interceptor {

@Override
public void intercept(Invocation arg0) {
Controller c = arg0.getController();
HttpServletRequest request = c.getRequest();
String path = request.getContextPath();
String portStr = "";
if (request.getServerPort() != 80) {
portStr = ":" + request.getServerPort();
}
String basePath = request.getScheme() + "://" + request.getServerName() + portStr + path + "/";
c.setAttr("basePath", basePath);
arg0.invoke();
}
}

波总,实在是麻烦你,这是我的BasePathInterceptor

704535983

2018-06-14 13:16

@JFinal 现在我的项目没有任何错误,所有的类都在一个项目下。

JFinal

2018-06-14 14:08

@704535983 仔细看异常, 难道是你的项目还有其他jar 包对老版本有依赖? 注意打开 pom.xml 的那个依赖视图去分析

还可以打成 war 包,看看是不是打出来两个 jfinal 的 jar 回复删除

704535983

2018-06-14 14:33

波总,找到问题了,我这个项目没有用maven,之前的1.8的jar包忘了删掉了。是你说的ActionInvocation提醒的我

704535983

2018-06-14 18:36

@JFinal 波总,现在出现个升级后遗症,是上传图片的问题。之前有个工具类,通过这个工具类是获取file的getAbsolutePath();获取了绝对路径,这样在getFile("name",path)的时候在1.8即可获取到上传的文件,但是现在升级到3.4之后,在getFile的时候源码中会拼一个baseUploadPath,这个已经获取到项目的upload绝对路径了,这中情况下我在getFile的时候传path就会出错,我尝试在config中设置me.setBaseUploadPath(""),就出错了,看了下代码,是不允许设置空。我想问下还有什么办法么。

JFinal

2018-06-14 18:52

@704535983 getFile("name", path) 中的 path 参数规则有点变化:
1:jfinal 1.8 老版本的规则: path 以 "/" 打头时采用绝对路径,否则是相对于 baseUploadPath 的一个相对路径

2:jfinal 新版本的规则改成了全都是相对于 baseUploadPath 的相对路径

试一下如下的两个方法解决:
1:配置 baseUploadPath: me.setBaseUploadPath(...)
注意,这里可以配置绝对路径,baseUploadPath 配置为绝对路径的例子为:
me.setBaseUploadPath("D:/upload");
me.setBaseUploadPath("/var/upload");

baseUploadPath 配置为相对路径的例子为:
me.setBaseUploadPath("myupload")
这里的相对路径是指相对于项目的 webapp 来说的

2:调囊 getFile("name", path) 时的 path 参数值。 注意这里的调整都是在 baseUploadPath 配置的基础上调整的

多做些 baseUploadPath 配置以及 getFile 时的 path 变量的尝试即可

热门反馈

扫码入社