独特的困惑JBOSS RESTEASY错误 - 找不到资源



通过负载平衡的Web服务器访问REST URL(2个Web服务器将请求转发到两个应用程序服务器)遇到了问题。当设置为单个Web服务器到单个JBOSS应用服务器时,不会发生此问题。

以下是我从JBOSS应用程序服务器日志中看到的错误消息:

16:02:46,711 DEBUG [org.jboss.resteasy.core.SynchronousDispatcher] (http-/30.31.32.33:8080-14) PathInfo: //AppName/rest/game/userStatus
16:02:46,711 DEBUG [org.jboss.resteasy.core.SynchronousDispatcher] (http-/30.31.32.33:8080-14) Failed executing GET //AppName/rest/game/userStatus: org.jboss.resteasy.spi.NotFoundException: Could not find resource for relative : //AppName/rest/game/userStatus of full path: http://stg.testing.com//AppName/rest/game/userStatus?userId=99984029883634
    at 
 org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:360) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:374) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:367) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:315) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:173) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:118) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.1.Final-redhat-1.jar:1.0.1.Final-redhat-1]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:679) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:931) [jbossweb-7.0.16.Final-redhat-1.jar:]
    at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_37]

以下是我的休息服务:

package com.testing.game;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonInclude;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.log4j.Logger;
@Path("/game")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class GameRest implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 9029403154444232148L;
    private final static Logger logger = Logger.getLogger(GameRest.class);
    @GET
    @Path("/userStatus")
    @Produces(MediaType.APPLICATION_JSON)
    public UserReportStatus getUserStatus(
            @QueryParam("userId") @DefaultValue("") String userId){
        logger.info("received request getReportStatus " + userId);
        GameService gs = new GameService();
        return gs.getUserReportStatus(userId);
    }
}

以下是Web.xml的主要内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:.. id="WebApp_ID" version="2.5">
    <display-name>AppName_Axis1</display-name>
    <!-- Auto scan REST service -->
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>
    <!-- this need same with resteasy servlet url-pattern -->
    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </context-param>
    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>
    <servlet>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <servlet>
        <display-name>Axis Admin Servlet</display-name>
        <servlet-name>AdminServlet</servlet-name>
        <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
        <load-on-startup>100</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>AdminServlet</servlet-name>
        <url-pattern>/servlet/AdminServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

我期望的结果是:

{"status":"Yes","dob":"01/01/1934","userName":"John Doe","reportStatus":"No"}

我在提出应用程序服务器的IP地址时会收到上述正确的结果http://30.31.32.33:8080/appname/rest/game/game/userstatus?userid=99984029883634

通过负载平衡的Web服务器,我获得的实际结果是:

HTTP Status 404 - Could not find resource for relative : //AppName/rest/game/userStatus of full path: http://stg.testing.com//AppName/rest/game/userStatus?userId=99984029883634

在向Web服务器URL请求时,我会收到上述结果。http://stg.testing.com/appname/rest/game/userstatus?userid=99984029883634

注意:我通过将stg.testing.com分配给Web服务器IP进行了测试 主机文件中的地址。

以下是httpd.conf文件W.R.T中的设置。

<Proxy balancer://stgsilo stickysession=JSESSIONID>
   BalancerMember http://30.31.32.33:8080/ min=10 max=100 route=node1 loadfactor=1
   BalancerMember http://30.31.32.34:8080/ min=10 max=100 route=node2 loadfactor=1
</proxy>
<Proxy balancer://stgsiloadmin stickysession=JSESSIONID>
   BalancerMember http://30.31.32.33:9990/ min=10 max=100 route=node1 loadfactor=1
   BalancerMember http://30.31.32.34:9990/ min=10 max=100 route=node2 loadfactor=1
</Proxy>
ProxyPass / balancer://stgsilo/
ProxyPass /console  balancer://stgsiloadmin/console
ProxyPass /management  balancer://stgsiloadmin/management
ProxyPassReverse /  http://30.31.32.33:8080
ProxyPassReverse /  http://30.31.32.34:8080
ProxyPassReverse /console  http://30.31.32.33:9990/console
ProxyPassReverse /console  http://30.31.32.34:9990/console
ProxyPassReverse /management  http://30.31.32.33:9990/management
ProxyPassReverse /management  http://30.31.32.34:9990/management
<Proxy *BATCHJOB*>
Order Deny,Allow
Allow from 30.
Deny from all
</Proxy>
<Proxy *-WS*>
Order Deny,Allow
Allow from all
</Proxy>

我将JBOSS 7.1.2用作我的应用服务器,而Apache作为Web服务器。此REST应用程序在后端使用Axis SOAP WebService客户端。因此,我在web.xml中具有与轴相关的语句。我已经证实了肥皂客户在两种情况下都可以使用。我不确定这是否是由于Web服务器问题(在AppName之前自动添加2个前向斜线)或类似于此处列出的JBOSS问题, 这里 和这里我已经尝试了以上有关JBOSS修复的三个建议,但仍然存在相同的错误。识别我错误原因的任何帮助都很棒。

一个更新:我通过将servlet插入上下文root下的单独目录中,并且可以从负载平衡器中触及servlet。因此,就目前而言,我假设这是一个软件问题,而不是硬件问题。另外,作为org.jboss.resteasy.core.core.synchronousdispatcher在请求期间被调用,我假设它不是404,而是一个内部重定向,该重定向引起双向斜线。任何帮助都是有用的。预先感谢。

今天我们找到了这个问题。该问题是由httpd.conf

中的Balancermember URL语句中的额外"/"引起的。

现在,Balancermember URL语句已更改为

.
.
<Proxy balancer://stgsilo stickysession=JSESSIONID>
   BalancerMember http://30.31.32.33:8080 min=10 max=100 route=node1 loadfactor=1
   BalancerMember http://30.31.32.34:8080 min=10 max=100 route=node2 loadfactor=1
</proxy>
.
.

相关内容

最新更新