独特的令人困惑的JBoss resteasy错误 - 无法找到资源

时间:2017-12-01 22:12:02

标签: java apache rest jboss httpd.conf

我通过负载均衡的Web服务器(2个Web服务器转发请求到两个应用服务器)访问其他URL时遇到问题。当设置为单个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"}

在向app服务器的ip地址发出请求时,我收到了上述正确的结果 http://30.31.32.33:8080/AppName/rest/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设置app服务器名称/ IP地址出现的位置。

<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作为我的app服务器,使用apache作为web服务器。此Rest应用程序在后端使用axis soap webservice客户端。因此我在web.xml中有与轴相关的语句。我已经验证了soap客户端在两种情况下都能正常工作。 我不确定这是由于Web服务器问题(在AppName之前自动添加2个正斜杠)还是jboss问题,如列出的herehere  和here 我已经尝试了以上三个jboss修复建议,但仍然有相同的错误。 任何帮助确定我的错误原因都会很棒。

更新:我尝试将servlet插入到上下文根目录下的单独目录中,并且可以从负载均衡器访问servlet。所以现在我假设这是一个软件问题而不是硬件问题。此外,在每个日志的请求期间调用org.jboss.resteasy.core.SynchronousDispatcher,我假设它不是404而是导致双正斜杠的内部重定向。任何帮助都会有用。提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

中的BalancerMember URL语句中的额外“/”引起的

现在,BalancerMember网址声明已更改为

.
.
<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>
.
.