Введите HttpServletRequest в службу отдыха - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу не вводить HttpServletRequest в мой сервис с помощью @Context аннотации.Вот мой пример:

@Path("/")
public class MyService {
    @Context
    private HttpServletRequest request;
}

Я использую реализацию Apache CXF, и вот мои зависимости от pom.xml:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    <version>3.1.7</version>
</dependency>

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>

Также я использую Apache Karaf OSGI-контейнер для развертывания, и поэтомуМое приложение относится к типу пакетной упаковки.Для этого есть конфигурация:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.5.0</version>
    <configuration>
        <instructions>
            <Import-Package>
                !*,
                javax.ws.rs,
                javax.ws.rs.core,
                javax.ws.rs.ext,
                org.apache.cxf.jaxrs.impl.tl,
            </Import-Package>
            <Embed-Transitive>true</Embed-Transitive>
        </instructions>
    </configuration>
</plugin>

Без javax.ws.rs.ext и org.apache.cxf.jaxrs.impl.tl в разделе import-пакета я получил одно из следующих исключений:

Caused by: java.lang.IllegalArgumentException: interface javax.ws.rs.ext.Providers is not visible from class loader 

Caused by: java.lang.IllegalArgumentException: interface org.apache.cxf.jaxrs.impl.tl.ThreadLocalProxy is not visible from class loader 

Так что теперь яу меня есть исключение при попытке развернуть мое приложение:

Caused by: java.lang.IllegalArgumentException: Can not set javax.servlet.http.HttpServletRequest field MyService.request to org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest

И я потратил много времени, чтобы выяснить, в чем проблема .. Но я заметил одну вещь:

, если я использую ThreadLocalHttpServletRequest request вместо HttpServletRequest request, тогда оно работает без исключений, но поле request равно null, когда я пытаюсь использовать его из любых методов.

Что я должен сделать, чтобы он нормально работал с HttpServletReqest?

1 Ответ

0 голосов
/ 14 ноября 2018

попробуйте использовать org.apache.cxf.jaxrs.ext.MessageContext

import javax.ws.rs.core.Context;
import org.apache.cxf.jaxrs.ext.MessageContext;



// your code goes like this
@Context 
private MessageContext context;



// try to get the request/response/session etc in your methods
HttpServletRequest req = context.getHttpServletRequest();
HttpServletResponse res = context.getHttpServletResponse()
...