Java RESTEasy中无法识别JAX-RS应用程序路径

Java RESTEasy中无法识别JAX-RS应用程序路径,java,path,jax-rs,resteasy,embedded-jetty,Java,Path,Jax Rs,Resteasy,Embedded Jetty,我正在使用嵌入式Jetty 9.1.0.v20131115和RESTEasy 3.0.7.Final。我定义了一个JAX-RS应用程序,我知道它正在工作,因为我所有的单例和类都在工作。看起来是这样的: @ApplicationPath("/foo/") public class MyApplication extends Application { @Path(value = "bar") public interface BarResource { @GET @Path(value

我正在使用嵌入式Jetty 9.1.0.v20131115和RESTEasy 3.0.7.Final。我定义了一个JAX-RS应用程序,我知道它正在工作,因为我所有的单例和类都在工作。看起来是这样的:

@ApplicationPath("/foo/")
public class MyApplication extends Application {
@Path(value = "bar")
public interface BarResource {

  @GET
  @Path(value = "test")
  public String getTest();
ServletContextHandler servletHandler = new ServletContextHandler();
servletHandler.setInitParameter("javax.ws.rs.Application", "com.company.MyApplication");
servletHandler.addServlet(new ServletHolder(HttpServletDispatcher.class), "/*");
然后我有一个这样的资源:

@ApplicationPath("/foo/")
public class MyApplication extends Application {
@Path(value = "bar")
public interface BarResource {

  @GET
  @Path(value = "test")
  public String getTest();
ServletContextHandler servletHandler = new ServletContextHandler();
servletHandler.setInitParameter("javax.ws.rs.Application", "com.company.MyApplication");
servletHandler.addServlet(new ServletHolder(HttpServletDispatcher.class), "/*");
因此,我尝试向
/foo/bar/test
发出
GET
,但失败了。仅当我将资源注释更改为以下内容时,它才起作用:

@Path(value = "/foo/bar")
public interface BarResource {
这违背了
@ApplicationPath(“/foo/”)
的全部目的,允许相对于某个基本路径定义我的资源。为什么RESTEasy不选择
@ApplicationPath
注释?

在Servlet容器中发布时,应用程序的值 可以使用web.xml中的servlet映射元素覆盖路径

如果按如下方式注册RestEasy HttpServletDispatcher,则可能会发生这种情况:

@ApplicationPath("/foo/")
public class MyApplication extends Application {
@Path(value = "bar")
public interface BarResource {

  @GET
  @Path(value = "test")
  public String getTest();
ServletContextHandler servletHandler = new ServletContextHandler();
servletHandler.setInitParameter("javax.ws.rs.Application", "com.company.MyApplication");
servletHandler.addServlet(new ServletHolder(HttpServletDispatcher.class), "/*");
您可以尝试添加此init参数:

servletHandler.setInitParameter("resteasy.servlet.mapping.prefix", "/application-path");

MyApplication
是否已启动?…应用程序…我知道它正在运行,因为我所有的单例和类都在运行。“您是否通过WAR文件部署到jetty?”我使用嵌入式jetty…“不涉及WAR文件。啊,我读过这篇文章,但直到现在才理解其全部含义:
@ApplicationPath
显然只与
web.xml
相关。但奇怪的是,我添加了servlet(代码与您所指出的类似),其映射为
/foo/*
。如果
servletHandler.addServlet(…)
相当于“web.xml中的servlet映射”,那么它应该重写为相同的值!将
resteasy.servlet.mapping.prefix
与编程servlet映射结合使用似乎很有效,谢谢。但是,我仍然不明白为什么需要额外的属性,因为我正确地映射了servlet。我还尝试映射到
/foo/*
,我也不知道为什么这不起作用。。。