2016-07-27 4 views
0

Ниже моя страница джерси вебсервис (application.java), который вызывает перехватчикДоступ SevletContext из перехватчика в успокоительной веб-сервиса

@Context ServletContext context 

@Path("/application") 
public class application{ 

    @POST 
    @Path("/getData") 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Interceptors(Interceptor.class) 
    public int metthod(Object input) throws Exception{ 
    // do something 
    } 
} 

ServletContext доступен на appliation.java, если я использую @Context ServletContext контекст, но я получаю NullPointerException, если я использую то же самое внутри класса Interceptor.

Как получить доступ к ServletContext из класса Interceptor.

Благодаря

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> 

<display-name>ws</display-name> 
<description>Web Services</description> 

<servlet> 
    <servlet-name>jersey-servlet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.java.files;com.fasterxml.jackson.jaxrs.json</param-value> 
    </init-param> 

    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <load-on-startup>1</load-on-startup> 

</servlet> 

<listener> 
    <listener-class>com.java.listener.appServletContextListener</listener-class> 
</listener> 

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

<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
</welcome-file-list> 

+0

Какой перехватчик является то, что? Какова его функция? Что делать? – pandaadb

+0

@pandaadb Функция перехватчика - это доступ к HashMap (который является атрибутом ServletContext). HashMap был инициализирован ServletContextListener. – coolaiddrinker

+0

Я думаю, что для этого потребуется немного больше информации. Используете ли вы каркас DI? Как вы создаете свой ресурс? Как правило, вы видите эту проблему: ваш перехватчик не управляется майкой, поэтому Джерси не знает, как ввести его в ваш перехватчик. Если это НЕ проблема, связанная с ресурсами (именно поэтому я упомянул, что прецедент в вашем сценарии важен), тогда нам придется обойти это. Но если вам нужен только этот доступ в контексте ваших запросов, используйте фильтры. Они управляются джерси и вводятся правильно. – pandaadb

ответ

1

Я попытаюсь помочь вам с вашим запросом и сделать это в ответ так, что он может быть отформатирован и легче читать. Прокомментируйте это, если я что-то недопонимаю.

С вашего вопроса, я думаю, вы не используете какие-либо другие рамки, кроме Weblogic и Jersey.

мне придется сделать несколько предположений здесь:

  1. Вашего перехватчик создается с помощью какого-то XML-разметки для вас, и вы сказать ему, чтобы перехватить все вызовы ваших методов ресурсов?
  2. Это соединены вместе статически в вашем XML-конфигурации где-то

Если вы можете обновить свой вопрос и добавить, как создать перехватчик?

По звукам, Weblogic предлагает контейнер, на котором выполняется эталонная реализация jax.rs (трикотаж). (Исправьте меня, если я ошибаюсь).

Существенной проблемой является то, что Weblogic не имеет понятия контекста. Если вы видите аннотацию, вы можете увидеть, что аннотации являются JAX-RS аннотациями:

javax.ws.rs.core.Context 

Что это означает, что вы можете использовать эту аннотацию с эталонными реализациями рамок JAX-RS, которая будет джерси , Джерси управляет бобами для вас (создание/инъекция/перехват и т. Д.) И является областью охвата запросов, поэтому он может вводить вам всевозможные интересные атрибуты, которые имеют какое-то отношение к вашему Webservice.

Это также почему @Context-аннотация работает в вашем ресурсе, потому что ваш ресурс обрабатывается джерси. Ваш перехватчик, однако, похоже, является перехватчиком Weblogic, который обрабатывается weblogic. Это не связано с вашей машинной логикой, поэтому инъекция здесь не работает.

Есть способы обойти это, используя каркас DI и облачные бобы (например, guice может сделать это для вас), однако это необязательно. Для вашей проблемы существует более интегрированный и плавный способ перехвата вызовов ресурсов.

Веб-сервис должен никогда не вызываться из приложения (например, он реагирует на HTTP-запросы). Это означает, что вы захотите перехватить эти звонки с помощью перехватчиков трикотажа, а не перехватчиков weblogic.Для этого, вы можете увидеть эти два интерфейса:

javax.ws.rs.container.ContainerRequestFilter 

javax.ws.rs.container.ContainerResponseFilter 

Вы предположили это право - одна из них перехватывает запросы, прежде чем ваш ресурс получает их, другие перехватывает после того как ваш ресурс обработал запрос.

Вы можете прочитать об этом здесь: https://jersey.java.net/documentation/latest/filters-and-interceptors.html

Так что в вашем USECASE, вы хотите, чтобы перехватить запрос, прежде чем передать его на свой ресурс. Если ваш ServletContextMap имеет какое-то значение, вы хотите прервать запрос (верните его пользователю с некоторой ошибкой).

Преимущество этого в том, что Фильтр обрабатывается трикотажным изделием, поэтому они могут быть введены трикотажем с вашим контекстом.

Рассмотрим это:

public class MyFilter implements ContainerRequestFilter { 

    @Context 
    private ServletContext context; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 

     boolean result = evaluateMyMap(); 

     if(!result) { 

      // This is the jersey way of not calling proceed. It will return a 400 response 
      // to the user with the message 

      requestContext.abortWith(Response.status(Status.BAD_REQUEST) 
        .entity("The Hashmap in the Context has some wonky value").build()); 
     } 

    } 

    private boolean evaluateMyMap() { 

     // access your context here and do your map evanulation 
     // return true if you want the request to be processed, false otherwise 

     return false; 
    } 

} 

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

Обратите внимание, что ваши фильтры также должны быть зарегистрированы в трикотаже. Как это сделать, я не уверен (потому что раньше я не использовал weblogic)

Надеюсь, что это объяснит вашу проблему и как ее решить. Дайте мне знать, если вам понадобится дополнительная консультация/помощь.

С уважением, Артур

+0

Спасибо. это работает. – coolaiddrinker