即使存在单个 servlet,也会出现“java.lang.IllegalStateException:多个 servlet 映射到路径 /*”错误

Posted

技术标签:

【中文标题】即使存在单个 servlet,也会出现“java.lang.IllegalStateException:多个 servlet 映射到路径 /*”错误【英文标题】:Getting 'java.lang.IllegalStateException: Multiple servlets map to path /*' error even though single servlet is present 【发布时间】:2021-07-03 10:08:10 【问题描述】:

即使我的代码中只有一个 servlet,我也会遇到错误。

WARN  2021-04-06 21:52:42,874  [main] org.eclipse.jetty.util.component.AbstractLifeCycle: FAILED ServletHandler@93501beFAILED: java.lang.IllegalStateException: Multiple servlets map to path /*: git.service.http.MyServlet68360fb9[mapped:EMBEDDED:null],io.dropwizard.jersey.setup.JerseyServletContainer-713e49c3[mapped:EMBEDDED:null]
java.lang.IllegalStateException: Multiple servlets map to path /*: git.service.http.MyServlet68360fb9[mapped:EMBEDDED:null],io.dropwizard.jersey.setup.JerseyServletContainer-713e49c3[mapped:EMBEDDED:null]

下面是我的代码:

environment
   .getApplicationContext()
   .addServlet(
           new ServletHolder(
                 new MyServlet(
                        injector.getInstance(HttpRepositoryResolver.class))),
           “/*“);

谁能帮我弄清楚?

【问题讨论】:

您认为泽西岛的运行情况如何? Jersey 实际上是一个 Servlet 应用程序。 哦,好吧。那么我应该在我的代码中进行哪些更改来解决这个问题? @PaulSamsotha 您需要更改您尝试注册的 servlet 的路径。 Jersey 具有将请求转发到其他 servlet 的选项,但要使其正常工作,Jersey 需要注册为 Servlet Filter ,但我认为 Dropwizard 没有任何配置选项可以执行此操作。您需要禁用 Dropwizard 的 Jersey(不确定是否可能)并手动将 Jersey 的 ServletContainer 注册为 servlet 过滤器。这是不好的解决方案。我不会推荐它(即使它是可能的)。更改 servlet 的路径。期间。 这是否可行(只是更改路径)?我会假设即使在这样做之后,Jersey 仍会使用其 /* 路径消耗所有请求。 我改变了路径,它工作了。我在这里不知道的是 JerseyServletContainer 使用相同的路径。非常感谢您的帮助!! @PaulSamsotha 【参考方案1】:

git.service.http.MyServletio.dropwizard.jersey.setup.JerseyServletContainer 都注册到 url-pattern /*

请记住,对于 Servlet,没有可选的请求处理。

如果请求的资源与 url 模式匹配,则将其发送到该 Servlet,它必须处理该请求,它不能“哦,不,不适合我,让其他人处理此请求”。

我建议将 Jersey 放在特定的东西上,例如 /api/*/rest/* 作为 url 模式。

【讨论】:

我改变了路径,它工作了。我在这里不知道的是 JerseyServletContainer 使用相同的路径。非常感谢您的帮助!! @Joakim Erdfelt

以上是关于即使存在单个 servlet,也会出现“java.lang.IllegalStateException:多个 servlet 映射到路径 /*”错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使使用单个 reducer 也会调用 Partitioner

为啥即使存在列,我也会有 ORA-00904?

为啥即使 jar 存在,火花应用程序也会因 java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig

即使使用测试广告单元,AdFailedToLoad 也会出现“无广告配置”错误

IntelliJ IDEA 出现" java: 程序包javax.servlet不存在 java: 程序包javax.servlet.annotation"等错误

即使引发 SQLException,flywaydb 也会应用 java 迁移