我的考试不及格,应该通过。该服务运行正常,但是JerseyTest JUnit测试失败,状态为400。

当我针对已部署的服务尝试使用此URL时,使用Postman或浏览器:

http://localhost:8080/myService/123?appId=local&userId=jcn


我得到正确的结果,状态为200,并在日志中看到以下内容:

    INFO: 4 * Server has received a request on thread http-nio-8080-exec-5
4 > GET http://localhost:8080/myService/123?appId=local&userId=jcn


注意?在URL中,这是正确的。

但是,当我在JeryseyTest扩展的Junit类中尝试此单元测试时:

@Test
public void getWithCorrectUrlExecutesWithoutError()
{
    String x = target("myService/123?appId=local&userId=jcn").request().get(String.class);
}


它失败并显示状态400,我在日志中看到了这一点:

INFO: 1 * Server has received a request on thread grizzly-http-server-0
1 > GET http://localhost:9998/myService/123%3FappId=local&userId=jcn


注意吗?已被%3F取代。

我不明白发生了什么。如果在浏览器中尝试“%3F” URL,则单元测试中会看到相同的400错误。因此,我可以肯定地确定url的编码是问题所在。

这是我的Jersey资源,部分列出,因为它很长,但是我很确定这是相关的部分:

    @Component
    @Path("/myService")
    public class MyResource
    {
        @Autowired
        SomeDao someDao;

        @NotBlank
        @QueryParam("appId")
        private String appId;

        @NotBlank
        @QueryParam("userId")
        private String userId;


        @GET
        @Path("/{id}")
        @Produces(MediaType.APPLICATION_JSON)
        public Status getStatus(@NotBlank @PathParam("id") String id)
        {
            errors = new ArrayList<>();
            Status retVal;

            if(validateId(id))
            {
                retVal = someDao.getStatus(id);
            }
            else
            {
                throw new BadParameterException(String.join(" | ", errors));
            }

            return retVal;
        }
}

最佳答案

您可以在queryParam method实例上使用WebTarget

String x = target("myService/123")
    .queryParam("appId", "local")
    .queryParam("userId", "jcn")
    .request()
    .get(String.class);

关于java - JerseyTest框架的路径编码替换了吗?与%3F,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36780814/

10-09 04:53