4

起初,在我的 Web 服务器中,我只有一个 REST servlet。就像是:

@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/*

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

  • / 工作正常,因为我在根目录下有一个 index.html 页面
  • /rest 工作正常,它调用我的 servlet 的 get 方法
  • /rest/resource1 返回 404 http 代码...

有什么帮助吗?我已经尝试了每个 @Path 指令之后和之前的 / 组合列表,但没有成功......非常感谢

一更新:

我使用了跟踪工具并得到了以下结果:

对于 /[app-name]/rest (有效):

  • X-Jersey-Trace-002 接受右手路径 java.util.regex.Matcher[pattern=/rest(/.*)? region=0,11 lastmatch=/rest]: "/rest" -> "/rest" : ""
  • X-Jersey-Trace-003 接受资源:"rest" -> @Path("/rest") xpto.mypack.Controller
  • X-Jersey-Trace-000 接受根资源类:“/rest”
  • X-Jersey-Trace-001 匹配路径 "/rest" -> "/application.wadl(/. )?", "/rest(/. )?"

对于 /[app-name]/rest/resource1 (它不起作用):

  • X-Jersey-Trace-002 匹配异常映射器:com.sun.jersey.api.NotFoundException@4fd41dc3 -> xpto.myclass
  • X-Jersey-Trace-003 将异常映射到响应:com.sun.jersey.api.NotFoundException@4fd41dc3 -> 404(未找到) X-Jersey-Trace-000 接受根资源类:“/resource1” X-Jersey- Trace-001 匹配路径“/resource1”->“/application.wadl(/.)?”、“/rest(/. ) ?”

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

4

1 回答 1

5

如果您将 servlet 映射定义为/rest/*,请不要/rest在资源的@Path注释中重复。即,您需要做的就是保持控制器不变(在您上面的问题中)并更改 servlet 映射。资源可用的 URL 是:

<application_context_path>/<servlet_mapping>

因此,如果您将@Path注释从更改@Path("/")@Path("rest")并且您还将 servlet 映射更改为/rest,那么您的资源将在以下位置可用:

<application_context_path>/rest/rest/*
于 2012-09-10T09:14:17.047 回答