2012-09-07 61 views
2

起初在我的web服务器上,我只有一个REST servlet。喜欢的东西:Jersey找不到REST webservice子资源

@Path("/") 
public class Controller { 
    @GET 
    @Produces({ MediaType.TEXT_HTML }) 
    public Response get(@Context UriInfo info) throws Exception { 
    ... 
    } 

    @GET 
    @Path("resource1") 
    @Produces({ MediaType.TEXT_HTML }) 
    public Response resource1() throws Exception { 
    ... 
    } 

    ... 

} 

而且在web.xml:

<servlet> 
    <servlet-name>rest</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>xpto.mypack1;xpto.mypack2</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>rest</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

但后来我想了一些静态html添加到服务器,所以我更新了servlet映射到 /REST/*

和控制器servlet类的@Path指令从“/”到“/ rest”。一切工作正常,但子资源或控制器的方法与@Path指令,停止工作..即:

  • /正常工作,因为我有一个index.html页在根
  • /休息工作正常,它调用我的servlet
  • /REST /资源1返回404 HTTP代码的get方法...

任何帮助吗?我已经尝试过/后各@Path指令之前的组合的列表,没有成功...非常感谢

一个更新:

我使用的跟踪UTIL,得到了以下结果:

为/ [应用名称] /休息(它的工作原理):

  • X-新泽西州痕量-002接受右手路径java.util.regex.Matcher中[图案= /休息(/.*)? X-Jersey-Trace-003接受资源:“休息” - > @路径(“/休息”):“/ rest” - >“/休息”:“”
  • xpto.mypack.Controller
  • X-新泽西州跟踪的000根接受资源类: “/休息”
  • X-新泽西州跟踪的001匹配路径 “/休息” - >“/application.wadl(/。 )?“,”/ rest(/。)?“

用于/ [应用程序名]/REST /资源1(它不工作):

  • X-新泽西州跟踪的002匹配的异常映射:com.sun.jersey.api。 NotFoundException @ 4fd41dc3 - > xpto.myclass
  • X-新泽西州痕量-003映射例外响应:[email protected] - > 404(未找到) X-新泽西州痕量-000接受根资源类:“/ resource1” X-Jersey-Trace-001匹配路径“/ resource1” - >“/application.wadl(/。)?”,“/ rest(/。)?”

我希望它可以帮助别人帮我..

+0

你有没有试过设置路径到'(“/ resource1”)' – ant

+0

是的,我试过了,结果相同。我试图调试以弄清楚发生了什么,并且我发现与模式相比较的url部分只是“休息”之后的部分。以休息结束的部分被认为是“基础网址”。这让我很困惑。顺便说一句,我使用的是tomcat。 :( – cattox

+0

现在我无法理解这一切......我从控制器@Path删除斜线,使其@Path(“”),一切工作正常......任何人都可以解释我为什么?:S – cattox

回答

4

如果你定义你的servlet映射,/rest/*,在@Path注释你的资源,不重复/rest。即所有你需要做的就是保持控制器原样(在你的问题上面),只需改变servlet映射。在该资源可用的网址是:

<application_context_path>/<servlet_mapping> 

因此,如果您更改@Path("/")@Path注释@Path("rest"),你也改变servlet映射到/rest,那么你的资源将可在:

<application_context_path>/rest/rest/* 
+0

做你的意思是让“/ rest”作为servlet_mapping和@Path(“/”)?或者“/ rest/*”和@Path(“/”)? – cattox