java.lang.NoSuchFieldError: ASYNC

java.lang.NoSuchFieldError: ASYNC

无法访问该页面并显示以下错误消息:

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的错误引用引起的。假设我在 Controller 中设置了 User。如果我想显示用户名,我使用 <c:out value="${user.name}"/>。但是如果我使用<c:out value="${user.namee}"/>,就会出现这个错误。

所以我想知道我是否在 Controller 中设置了很多对象,并在页面上显示了这些对象的消息。我怎样才能找到导致错误的原因?

在标准 Java EE API, ASYNC is recognizable as a field of DispatcherType enum.

这个枚举是在 Servlet 3.0 中引入的。因此,这个问题表明 webapp 的运行时类路径被混合 Servlet API 版本污染。例如。 Servlet 2.5 和 Servlet 3.0 混合使用。该实现是为 Servlet 3.0 或更新版本(可能是 Jetty 本身)加载的,但是 API 是为 Servlet 2.5 或更早版本加载的(可能是通过 webapp)。

最常见的原因是 WAR 文件在 /WEB-INF/lib 中错误地包含了一个 Servlet API JAR 文件甚至 Java EE JAR 文件。您应该确保 WAR 的 /WEB-INF/lib 不包含目标运行时本身(在您的情况下为 Jetty)已经提供的任何库。这与使用的版本无关。即使您调整了版本,您也不应该与 webapp 一起提供特定于服务器的库。

当您使用 Maven 时,在 webapp 的 pom.xml 中将服务器提供的库标记为 <scope>provided</scope>。当您手动携带 JAR 时,只需从 /WEB-INF/lib 文件夹中物理删除服务器提供的库。

请注意,这与 JSTL 无关。

另请参阅:

  • How do I import the javax.servlet API in my Eclipse project?