2017-01-03 8 views
0

я начинаю сервер Grizzly следующим образом:Джерси + Spring - Инъекция запрос сервлета

URI baseUri = UriBuilder.fromUri("http://localhost/").port(9998).build(); 

ResourceConfig resourceConfig = new ResourceConfig(); 
resourceConfig.packages("com.example"); 
resourceConfig.property("contextConfig", applicationContext); 

HttpServer server = GrizzlyHttpServerFactory.createHttpServer(baseUri, resourceConfig, false); 

server.start(); 

В пакете com.example, у меня есть фильтры следующим образом:

@Component 
@Provider 
@Priority(0) 
public class MyFilter implements ContainerRequestFilter { 

    @Context 
    private HttpServletRequest httpServletRequest; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     /* httpServletRequest is null here */ 
    } 
} 

Мои фильтр создается, как ожидается, весной. Кроме того, JAX-RS обнаружил его и использует тот же экземпляр, созданный Spring. Я пытаюсь получить доступ к базовому HttpServletRequest, но я не могу найти, как это сделать.

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

ответ

1

Вы должны использовать GrizzlyWebContainerFactory от

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-grizzly2-servlet</artifactId> 
    <version>${jersey2.version}</version> 
</dependency> 

, если вы хотите создать контейнер сервлетов. В настоящее время вы не создаете контейнер сервлета, поэтому нет HttpServletRequest.

Вы можете сделать что-то вроде

GrizzlyWebContainerFactory.create(baseUri, new ServletContainer(resourceConfig)); 
+0

Можно не использовать контейнер сервлетов? При использовании развертывания на основе сервлетов поставщик компонента Spring ожидает WebApplicationContext, а мой контекст является автономным AnnotationConfigApplicationContext. –

+0

Когда мое приложение запускается, контекст корневого приложения создается на основе класса Spring Configuration. Я хочу, чтобы этот корневой контекст был доступен для Джерси, поэтому я устанавливал свойство contextConfig. Однако это свойство не имеет значения при использовании контейнера сервлета, и в этом случае ожидается, что WebApplicationContext будет под атрибутом сервлета org.springframework.web.context.WebApplicationContext.ROOT. –

+0

Не совсем, так как это сервлет API. К чему вы пытаетесь получить доступ? Вы можете ввести Grizzly 'Request' в' @ Context'. Возможно, это даст вам достаточно информации. –