Rest Jersey提供404-在有效服务上找不到

Rest Jersey提供404-在有效服务上找不到,rest,servlets,jersey,http-status-code-404,jax-rs,Rest,Servlets,Jersey,Http Status Code 404,Jax Rs,我在Jersey Rest Servlet上遇到了一个奇怪的问题,我正在使用Jersey 1.17.1和下面的配置,但是,当我尝试访问我的Rest服务时,它只会给我一个404-找不到错误 奇怪的是这个日志:接受根资源类:“/”,但我不是在上请求“/”我是在上请求的“/r/…” com.sun.jersey.config.property.resourceConfigClass 日志显示服务已正确加载: Root resource classes found: class com.xxx.re

我在Jersey Rest Servlet上遇到了一个奇怪的问题,我正在使用Jersey 1.17.1和下面的配置,但是,当我尝试访问我的Rest服务时,它只会给我一个404-找不到错误

奇怪的是这个日志:接受根资源类:“/”,但我不是在上请求“/”我是在上请求的“/r/…”

com.sun.jersey.config.property.resourceConfigClass

日志显示服务已正确加载:

Root resource classes found:
  class com.xxx.restful.SearchRESTService
在这里,您可以看到服务正在运行:

2 < X-Jersey-Trace-001: match path "/" -> "/application\.wadl(/.*)?", "/request(/.*)?", "/search(/.*)?"
2“/application\.wadl(/.*)”、“/request(/.*)”、“/search(/.*)”
web.xml

<context-param>
    <param-name>context-root</param-name>
    <param-value>root</param-value>
</context-param>

<servlet>
        <servlet-name>JerseyREST</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
            <param-value>com.xxx.restful.ResourceConfig</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>

        <init-param>
            <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
            <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
            <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.config.feature.Trace</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.config.feature.Debug</param-name>
            <param-value>true</param-value>
        </init-param>

        <load-on-startup>3</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>JerseyREST</servlet-name>
        <url-pattern>/r/*</url-pattern>
    </servlet-mapping>

上下文根
根
运动衫
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.config.property.resourceConfigClass
com.xxx.restful.ResourceConfig
com.sun.jersey.api.json.POJOMappingFeature
真的
com.sun.jersey.spi.container.ContainerRequestFilters
com.sun.jersey.api.container.filter.LoggingFilter
com.sun.jersey.spi.container.ContainerResponseFilters
com.sun.jersey.api.container.filter.LoggingFilter
com.sun.jersey.config.feature.Trace
真的
com.sun.jersey.config.feature.Debug
真的
3.
运动衫
/r/*
休息服务:

@Path("/search")
public class SearchRESTService {

    @GET
    @Path("/related")
    @Produces({ MediaType.APPLICATION_JSON })
    public Response getRelatedSearch(@QueryParam("query") String query) {
        List<String> result = ...;
        return Response.ok(result).build();
    }
}
@Path(“/search”)
公共类搜索服务{
@得到
@路径(“/相关”)
@产生({MediaType.APPLICATION_JSON})
公共响应getRelatedSearch(@QueryParam(“查询”)字符串查询){
列表结果=。。。;
返回Response.ok(result.build();
}
}
启动日志

INFO: Initiating Jersey application, version 'Jersey: 1.17.1 02/28/2013 12:47 PM' Oct 31, 2013 1:37:52 PM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  com.xxx.restful
Oct 31, 2013 1:37:52 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class com.xxx.restful.SearchRESTService
Oct 31, 2013 1:37:52 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Provider classes found:
  class com.xxx.restful.NucleusProducer
Oct 31, 2013 1:37:52 PM com.sun.jersey.server.impl.application.DeferredResourceConfig$ApplicationHolder <init>
INFO: Instantiated the Application class com.xxx.restful.NucleusResourceConfig
Oct 31, 2013 1:38:08 PM com.sun.jersey.api.container.filter.LoggingFilter filter
INFO: 2 * Server in-bound request
2 > OPTIONS http://localhost:7103/root/r/search/related?query=arduino
2 > Host: localhost:7103
2 > Connection: keep-alive
2 > User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
2 > Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
2 > Content-Type: application/json
2 > Accept: */*
2 > DNT: 1
2 > Accept-Encoding: gzip,deflate,sdch
2 > Accept-Language: en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4
2 >

Oct 31, 2013 1:38:08 PM com.sun.jersey.api.container.filter.LoggingFilter$Adapter finish
INFO: 2 * Server out-bound response
2 < 404
2 < X-Jersey-Trace-000: accept root resource classes: "/"
2 < X-Jersey-Trace-001: match path "/" -> "/application\.wadl(/.*)?", "/request(/.*)?", "/search(/.*)?"
2 < X-Jersey-Trace-002: mapped exception to response: com.sun.jersey.api.NotFoundException@7fae8378 -> 404 (Not Found)
2 <
INFO:启动Jersey应用程序,版本“Jersey:1.17.1 02/28/2013 12:47 PM”2013年10月31日下午1:37:52 com.sun.Jersey.api.core.PackagesResourceConfig init
信息:扫描包中的根资源和提供程序类:
com.xxx.restful
2013年10月31日下午1:37:52 com.sun.jersey.api.core.ScanningResourceConfig logClasses
信息:找到根资源类:
类com.xxx.restful.SearchRESTService
2013年10月31日下午1:37:52 com.sun.jersey.api.core.ScanningResourceConfig logClasses
信息:找到提供程序类:
类com.xxx.restful.NucleusProducer
2013年10月31日下午1:37:52 com.sun.jersey.server.impl.application.DeferredResourceConfig$ApplicationHolder
信息:实例化了应用程序类com.xxx.restful.NucleusResourceConfig
请求日志

INFO: Initiating Jersey application, version 'Jersey: 1.17.1 02/28/2013 12:47 PM' Oct 31, 2013 1:37:52 PM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  com.xxx.restful
Oct 31, 2013 1:37:52 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class com.xxx.restful.SearchRESTService
Oct 31, 2013 1:37:52 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Provider classes found:
  class com.xxx.restful.NucleusProducer
Oct 31, 2013 1:37:52 PM com.sun.jersey.server.impl.application.DeferredResourceConfig$ApplicationHolder <init>
INFO: Instantiated the Application class com.xxx.restful.NucleusResourceConfig
Oct 31, 2013 1:38:08 PM com.sun.jersey.api.container.filter.LoggingFilter filter
INFO: 2 * Server in-bound request
2 > OPTIONS http://localhost:7103/root/r/search/related?query=arduino
2 > Host: localhost:7103
2 > Connection: keep-alive
2 > User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
2 > Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
2 > Content-Type: application/json
2 > Accept: */*
2 > DNT: 1
2 > Accept-Encoding: gzip,deflate,sdch
2 > Accept-Language: en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4
2 >

Oct 31, 2013 1:38:08 PM com.sun.jersey.api.container.filter.LoggingFilter$Adapter finish
INFO: 2 * Server out-bound response
2 < 404
2 < X-Jersey-Trace-000: accept root resource classes: "/"
2 < X-Jersey-Trace-001: match path "/" -> "/application\.wadl(/.*)?", "/request(/.*)?", "/search(/.*)?"
2 < X-Jersey-Trace-002: mapped exception to response: com.sun.jersey.api.NotFoundException@7fae8378 -> 404 (Not Found)
2 <
2013年10月31日下午1:38:08 com.sun.jersey.api.container.filter.LoggingFilter
信息:2*绑定请求中的服务器
2>选项http://localhost:7103/root/r/search/related?query=arduino
2>主机:本地主机:7103
2>连接:保持活动状态
2>用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/30.0.1599.101 Safari/537.36
产地:铬-extension://hgmloofddffdnphfgcellkdfbfbjeloo
2>内容类型:应用程序/json
2>接受:*/*
2>DNT:1
2>接受编码:gzip、deflate、sdch
2>接受语言:en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4
2 >
2013年10月31日下午1:38:08 com.sun.jersey.api.container.filter.LoggingFilter$适配器完成
信息:2*服务器外部绑定响应
2 < 404
2“/application\.wadl(/.*)”、“/request(/.*)”、“/search(/.*)”
2404(未找到)
2 <

我认为您需要在
web.xml
中添加以下行。假设您的Jersey类位于package
com.example
中,则需要添加:

<init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>com.example</param-value>
</init-param>

com.sun.jersey.config.property.packages
com.example

这将确保Jersey可以找到您的根资源类。

这不是问题,因为服务是使用com.sun.Jersey.config.property.resourceConfigClass属性加载的。日志显示服务已正确加载:找到根资源类:class com.xxx.restful.SearchRESTService,在这里您可以看到服务正在运行:2“/application\.wadl(/.*)”、“/request(/.*)”、“/search(/.*)”,如果将
/r/*
更改为
/*
,该怎么办?你看到同样的404错误了吗?是的,同样的错误。我将服务从/search改为/that,它给出了403,而不是一个look方法。您能找到问题所在吗?您的服务器是否支持
上下文根
上下文参数?如果在URL中不使用
root
,它会说什么?