JerseyTest失败,因为HttpServletRequest为空

时间:2016-10-30 02:38:26

标签: java jersey-2.0

我在使用JerseyTest时使用的资源使用了validateSession方法之前,当资源不使用validateSession时它工作正常,但是使用validateSession扩展类会在测试中抛出500错误。我认为是因为在测试中HttpServletRequest为null。我尝试在相同的方法测试中首先在测试之前进行登录,但是失败了。任何帮助。这是一个简单的资源:

@Path("/test")
public class Prueba extends BaseLoginWebService {

final static Logger logger = Logger.getLogger(Prueba.class);

@GET
public String saludo() {
    return "it works";
  }
}

为了返回String的资源,使用带有validateSession方法的BaseLoginWebService,之前它使用的是LoginWebService:

public class BaseLoginWebService {

@Context
HttpServletRequest request;

final static Logger logger = Logger.getLogger(Prueba.class);

@PostConstruct
public void init() throws Exception {
    validateSession();
}

private void validateSession() throws Exception {
    HttpSession session = request.getSession();
    Cookie[] cookies = request.getCookies();
    String token = null;
    for (Cookie cookie : cookies) {
        if ((cookie.getValue().equals(session.getAttribute("token")))) {
            token = (String) session.getAttribute("token");
            break;
        }
    }
    if (token == null) {
        throw new Exception("no session");
    }
}
}

LoginWebService:

@Path("/login")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class LoginWebService {

@Context
HttpServletRequest request;

@POST
public Response login(LoginEntity loginEntity) {
    if (loginEntity != null) {
        if (loginEntity.getUser().equals("root") && loginEntity.getPassword().equals("root")) {
            HttpSession session = request.getSession();
            session.setMaxInactiveInterval(5);
            Random random = new Random();
            int token = random.nextInt(100) + 1;
            session.setAttribute("token", String.valueOf(token));
            return Response.noContent().cookie(new NewCookie("token", String.valueOf(token))).build();
        } else {
            return Response.status(Response.Status.BAD_REQUEST).build();
        }
    } else {
        return Response.status(Response.Status.CONFLICT).build();
    } 
}
}

资源运行正常,但在测试中没有:

public class PruebaTest extends JerseyTest {

@Override
public Application configure() {
    enable(TestProperties.DUMP_ENTITY);
    enable(TestProperties.LOG_TRAFFIC);
    return new ResourceConfig(Prueba.class);
}

@Override
protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
    return new ExternalTestContainerFactory();
}

@Override
protected URI getBaseUri() {
    URI uri = UriBuilder.fromPath("http://localhost:9090/messenger_webapp/rest").build();
    return uri;
}

@Test
public void saludoTest() {
    System.out.println("saludoTest");
    String output = target("/test").request().get(String.class);
    assertEquals("Should return it works", "it works", output);
}
}

错误:

javax.ws.rs.InternalServerErrorException: HTTP 500 Request failed.

at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1020)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:816) 
  ..... and more .....

2 个答案:

答案 0 :(得分:0)

请检查您正在使用的测试容器。根据{{​​3}}

的文件
  

内存容器不是真正的容器。它开始泽西岛   应用程序并直接调用内部API来处理创建的请求   由测试框架提供的客户端。没有网络   涉及的沟通。这个容器不支持servlet和   其他容器依赖功能,但它是一个完美的选择   简单的单元测试。

因此,如果您正在使用内存容器并尝试使用servlet功能,那么它将无法工作。在这种情况下,请尝试使用grezzly提供程序或其他与您的最终部署目标相近的其他内容

答案 1 :(得分:0)

您尚未提供有关如何部署应用程序的任何详细信息,仅当将应用程序部署在servlet容器(例如Tomcat)中时,HttpServletResponse才可用于注入。这可能是您的问题。

我与GrizzlyHttpServer有类似的问题。我遇到这个问题的原因是,Grizzly提供了与Servlet规范所提供的相似的抽象:HttpHandler(Servlet),Request(HttpServletRequest),Response(HttpServletResponse)。

所以我不得不使用:import org.glassfish.grizzly.http.server.Request;
而不是:import javax.servlet.http.HttpServletRequest;