【问题标题】:Jersey Servlet: RequestDispatcher returning 404Jersey Servlet:RequestDispatcher 返回 404
【发布时间】:2018-02-06 22:37:54
【问题描述】:

我需要将请求转发到 REST 服务并编写以下代码:

private void performTask(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
    ServletContext portalContext = this.getServletContext();
    ServletContext restService = portalContext.getContext("/restService");
    RequestDispatcher dispatcher = restService.getRequestDispatcher("/resources/*");
    dispatcher.forward(request, response);

}

Service "/restService" 还有一个处理请求的 servlet,它的定义如下:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.service.RESTApplication</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.rest.resources</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

RESTApplication 类有这样的代码:

public RESTApplication() {
    register(WadlFeature.class);
    register(JacksonFeature.class);
    register(MultiPartFeature.class);
    property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);
}

“com.rest.resources”中有几个类映射到请求附带的路径 (/resources/*)。 但是当“getRequestDispatcher”Jersey 转发请求时会抛出 404 错误。 Jersey 似乎无法将我的请求映射到正确的 servlet。如果我使用 Postman 粘贴相同的 URL,则请求会正常处理。调度员的检查是:

为了验证问题是否出在 Jersey,我创建了一个从 HttpServlet 扩展的 Servlet,并且没有提交给 Jersey:

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.rest.resources.helloResource</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>  

在这之后,我执行了这段代码:

private void performTask(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
    ServletContext portalContext = this.getServletContext();
    ServletContext restService = portalContext.getContext("/restService");
    RequestDispatcher dispatcher = restService.getRequestDispatcher("/hello");
    dispatcher.forward(request, response);
}

出乎意料的是,这个转发实现了放置在“com.rest.resources”中的类helloResource。

有没有人遇到过类似的情况? “getRequestDispacther”如何找到并转发存在于“/resources/”的servlet?*

使用的版本: 球衣 2.6 小服务程序 2.5 jboss 4.2.3-GA

【问题讨论】:

  • 所以hello 有效而resources 无效?我想知道resources路径是否是servlet已经使用的一些保留路径?
  • @JorgeCampos 是的,“你好”工作得很好。对我来说,这似乎不是保留字问题,而是转发请求时的 Jersey 问题

标签: java rest servlets jersey requestdispatcher


【解决方案1】:

Jersey 似乎希望“getRequestDispatcher”完成必须处理的 URL,而不是将其委托给映射的 servlet。

这个问题解决了:

RequestDispatcher 调度程序 = datasulRest.getRequestDispatcher("/resources/" + request.getPathInfo());

在此之后,请求由放置在“com.rest.resources”中的资源处理。

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2018-12-13
    • 2018-06-25
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多