无法访问该页面并显示以下错误消息:
java.lang.NoSuchFieldError: ASYNC
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
这是页面中错误消息的一部分。
根据我的经验,此错误是由使用JSTL的错误引用引起的。假设我在User
中设置Controller
。如果我想显示用户名,请使用<c:out value="${user.name}"/>
。但是,如果我使用<c:out value="${user.namee}"/>
,则会发生此错误。
所以我想知道我是否在Controller
中设置了很多对象,并在页面上显示了这些对象的消息。如何找到哪一个导致错误?
答案 0 :(得分:1)
在标准Java EE API中,ASYNC
可被识别为DispatcherType
enum的字段。
这个枚举是在Servlet 3.0中引入的。因此,这个问题表明webapp的运行时类路径被混合的Servlet API版本污染。例如。 Servlet 2.5和Servlet 3.0混合使用。实现是为Servlet 3.0或更新版本(可能是Jetty本身)加载的,但API已加载到Servlet 2.5或更早版本(可能通过webapp)。
最常见的原因是WAR文件错误地包含Servlet API JAR文件,甚至包含/WEB-INF/lib
中的Java EE JAR文件。您应确保WAR /WEB-INF/lib
不包含目标运行时本身已提供的任何库(在您的情况下为Jetty)。这与使用的版本无关。即使你对齐版本,你也不应该提供特定于服务器的库以及webapp。
当您使用Maven时,请在webapp&#39; <scope>provided</scope>
中将服务器提供的库标记为pom.xml
。当您手动携带JAR时,只需从/WEB-INF/lib
文件夹中物理删除服务器提供的库。
请注意,这与JSTL无关。