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

@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 .....

最佳答案

请检查您使用的是哪个测试容器。根据https://jersey.java.net/nonav/documentation/latest/test-framework.html上的文档


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


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

10-06 14:33