Я использую встроенный 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();
Поэтому я пытаюсь выпустить GET
в /foo/bar/test
и он терпит неудачу. Он работает только при изменении аннотации ресурса до следующего:
@Path(value = "/foo/bar")
public interface BarResource {
Это побеждает всю цель @ApplicationPath("/foo/")
, позволяя определять мои ресурсы относительно некоторого базового пути. Почему RESTEasy не @ApplicationPath
аннотацию @ApplicationPath
?
При публикации в контейнере Servlet значение пути приложения может быть переопределено с помощью элемента отображения сервлета в web.xml.
Похоже, это происходит, если вы зарегистрируете RestEasy HttpServletDispatcher следующим образом:
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");
@ApplicationPath
видимому, имеет отношение только к отсутствующему web.xml
. Но как ни странно, я добавляю сервлет (в коде, аналогичном указанному вами) с отображением /foo/*
. Если servletHandler.addServlet(...)
эквивалентен «отображению сервлета в web.xml», то он должен переопределить то же значение! resteasy.servlet.mapping.prefix
использование resteasy.servlet.mapping.prefix
в сочетании с программным отображением сервлетов работает. Я до сих пор не понимаю, зачем нужно дополнительное свойство, так как я правильно отображаю сервлет.
/foo/*
и я также понятия не имею, почему это не работает ...
MyApplication
подобрано?