2014-01-15 2 views
1

Мне интересно, можно ли отправить запрос с сервлета на ресурс класса Джерси (JAX-RS). Я пытаюсь это сделать, но он, похоже, не работает, и, согласно моей регистрации, ресурс трикотажа никогда не достигается.Как отправить запросы сервлетов на методы ресурсов Джерси

Примеры кода приведены ниже. Почему-то я пытаюсь сделать невозможным?

Обратите внимание, что ресурс Джерси работает правильно, когда я обращаюсь к нему напрямую в веб-браузере через адресную строку.

Также обратите внимание, что «RequestDispatcher.forward()» работает должным образом. Это просто «включить», которого нет.

сервлет

//The Jersey dispatcher url-filter is set to '/api/*' 
String servletID = "/api/items"; 
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(servletID); 
dispatcher.include(request, response);  

Джерси ресурс

@GET @Path("/items") 
@Produces ({MediaType.TEXT_XML}) 
public JAXBElement<Items> getItems(@PathParam("project") String project) throws  IOException, JAXBException { 

    log.debug("reached getItems"); 

    //Omitted code that returns 'Items' object wrapped in JAXBElement 

} 

Соответствующие части web.xml

<servlet> 
    <servlet-name>jerseyDispatcher</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>uk.co.web.api.resource</param-value> 
    </init-param> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jerseyDispatcher</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 
+0

Пожалуйста, введите код, который создает 'диспетчер'. –

+0

@ LutzHorn Я отредактировал этот вопрос, чтобы включить это сейчас – Paul

+0

Вы пришли к выводу, как добиться этого с Джерси? – tareq

ответ

0

Возможно, вы перешлите запрос.

HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; 
RequestDispatcher requestDispatcher = null; 
requestDispatcher = httpServletRequest.getRequestDispatcher("/items"); 
dispatcher.forward(request, response); 
return; 

Однако обратите внимание, если вы получаете запрос GET и попытаться направить на ресурс POST, Он выбросит ошибку 405.

Edit:

Позвольте мне понять, что вы пытаетесь достичь, если вам нужно написать содержание в выходной поток ответа можно использовать фильтр джерси ресурсов.

public class YourResourceFilter implements ResourceFilter 
    { 
    public ContainerRequestFilter getRequestFilter() 
     { 
      return new ContainerRequestFilter() 
      { 
       @Override 
       public ContainerRequest filter(ContainerRequest containerRequest) 
       { 
//Pre- editing the request 
       return containerRequest; 
       } 
      }; 
     } 

    @Override 
     public ContainerResponseFilter getResponseFilter() 
     { 
      return new ContainerResponseFilter() 
      { 
       @Override 
       public ContainerResponse filter(ContainerRequest containerRequest, ContainerResponse containerResponse) 
       { 
// after the request has been completed by your jersey resource 
        return containerResponse; 
       } 
      }; 
     } 

    } 
+0

Я не могу переслать запрос, поскольку, к сожалению, сервлету необходимо добавить больше контента в выходной поток потом – Paul

+0

Извините, я не думаю, что вы понимаете проблему. Я хочу отправить запрос, который сначала обрабатывается javax.servlet.http.HttpServlet до метода ресурсов Джерси. – Paul

+0

Я попробовал то, что вы только что отправили, с вопросом «Включить». Проблема в том, что я предлагал другой подход к вашей необходимости «добавлять содержимое в выходной поток после». – Gerard

0

Я получил его на работу, вроде (Jersey 2,13) ​​путем настройки Джерси в качестве фильтра, а не сервлета в web.xml. Тогда вы можете сказать контейнер, чтобы применить фильтр включенных запросов также:

<filter-mapping> 
    <filter-name>Jersey Web Application</filter-name> 
    <url-pattern>/api/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

RequestDispatcher.include будет работать на запрос обрабатывается по-Джерси, тоже. Однако есть оговорка. Джерси вызывает response.getOutputStream, поэтому все вывод должен быть выполнен через указанный выходной поток - это исключает страницы JSP, которые вместо этого используют response.getWriter. Итак, если вы не выясните, как обойти эту проблему, забудьте о включении ресурса Джерси на странице JSP или, наоборот, в том числе о результатах оценки JSP как части ответа REST.

+0

Не могли бы вы предоставить ссылку, в которой говорится, как включить теги ''? Я не могу заставить его работать, включив его в 'web.xml', eclipse говорит' Invalid content ... ' – tareq

+0

См. Например. (Http://sqltech.cl/doc/oas10gR31/web.1013/b28959/filters.htm#BCFIEDGB); '' был добавлен в Servlet 2.4, убедитесь, что вы объявляете правильный пролог web.xml. –

Смежные вопросы