【问题标题】:Test case for testing a jersey web resource using grizzle is giving me 404使用 grizzle 测试球衣网络资源的测试用例给了我 404
【发布时间】:2016-06-18 22:28:29
【问题描述】:

我尝试了以下方法,效果很好

package test;

import static org.junit.Assert.assertEquals;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;

    import org.glassfish.jersey.server.ResourceConfig;
    import org.glassfish.jersey.test.DeploymentContext;
    import org.glassfish.jersey.test.JerseyTest;
    import org.glassfish.jersey.test.ServletDeploymentContext;
    import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
    import org.glassfish.jersey.test.spi.TestContainerException;
    import org.glassfish.jersey.test.spi.TestContainerFactory;
    import org.junit.Test;

    import com.mkyong.rest.HelloWorldService;

    public class HelloWorldServiceTest extends JerseyTest{

        @Path("hello")
        public static class HelloResource {
            @GET
            public String getHello() {
                return "Hello World!";
            }
        }

        @Override
        protected Application configure() {
            return new ResourceConfig(HelloResource.class);
        }

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

        @Override
        protected DeploymentContext configureDeployment() {
            return ServletDeploymentContext.forPackages(
                    getClass().getPackage().getName()).build();
        }

        @Test
        public void testSingleNode() throws Exception {
            final String hello = target("hello").request().get(String.class);
            assertEquals("Hello World!", hello);
        }
        }

当我尝试用这个测试类和包之外的资源替换资源时,如下所示

   package test;

import static org.junit.Assert.assertEquals;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.DeploymentContext;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.ServletDeploymentContext;
import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
import org.glassfish.jersey.test.spi.TestContainerException;
import org.glassfish.jersey.test.spi.TestContainerFactory;
import org.junit.Test;

import com.mkyong.rest.HelloWorldService;

public class HelloWorldServiceTest extends JerseyTest{

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello() {
            return "Hello World!";
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloWorldService.class);
    }

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

    @Override
    protected DeploymentContext configureDeployment() {
        return ServletDeploymentContext.forPackages(
                getClass().getPackage().getName()).build();
    }

    @Test
    public void testSingleNode() throws Exception {
        final String hello = target("hello").path("Test").request().get(String.class);
        assertEquals("Jersey say : Test", hello);
    }
    }

HelloWorldService.java

package com.mkyong.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/hello")
public class HelloWorldService {

    @GET
    @Path("/{param}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getMsg(@PathParam("param") String msg) {

        String output = "Jersey say : " + msg;

        return Response.status(200).entity(output).build();

    }

}

RestApplication.java

      package rest;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import com.mkyong.rest.HelloWorldService;

public class RestApplication extends Application{

      @Override
        public Set<Class<?>> getClasses() {
            Set<Class<?>> s = new HashSet<Class<?>>();

            s.add(HelloWorldService.class);
            return s;
        }


}

web.xml

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Restful Web Application</display-name>

     <servlet>
    <servlet-name>rs-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>rest.RestApplication</param-value>
</init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>rs-servlet</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

</web-app>

我遇到了异常

   javax.ws.rs.NotFoundException: HTTP 404 Not Found
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:917)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:770)
at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:90)
at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:671)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:423)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:667)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:396)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:296)
at test.HelloWorldServiceTest.testSingleNode(HelloWorldServiceTest.java:48) 

谁能纠正我哪里出错了...

【问题讨论】:

    标签: jersey-test-framework


    【解决方案1】:

    看看这个

    @Override
    protected DeploymentContext configureDeployment() {
        return ServletDeploymentContext.forPackages(
                getClass().getPackage().getName()).build();
    }
    

    forPackages 表示要扫描哪个包以查找 @Path@Provider 注释类,并自动注册它们。它在第一个示例中起作用的原因是资源类(带有@Path 注释的类在getClass().getPackage().getName() 包中。

    这个方法

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloWorldService.class);
    }
    

    永远不会被调用,因为你覆盖了getDeploymentContext()。通常,如果您不覆盖该方法,它将调用configure 方法将应用程序注册到部署上下文。但你永远不会这样做。

    因此,您应该使用接受Application 类的ServletDeploymentContext.builder 方法之一,而不是forPackages

    return ServletDeploymentContext.builder(configure()).build()
    
    return ServletDeploymentContext.builder(RestApplication.class).build();
    

    @Override
    public ResourceConfig configure() {
        return new ResourceConfig(HelloWorldService.class);
    }
    
    @Override
    public ServletDeploymentContext configureDeployment() {
        return SerlvetDeploymentContext.forServlet(new ServletContainer(configure));
    }
    

    需要注意的是,如果你想设置一个 servlet 环境,你只需要覆盖getTestContainerFactoryconfigureDeployment。这意味着,您需要在应用程序中使用像 HttpServletRequestServletContext 等 servlet API。如果您不需要 servlet 环境,只需覆盖 configure 就足够了。

    【讨论】:

    • 嗨@peeskille,谢谢您的回复。我尝试了您在评论中提到的任何内容,ServletDeploymentContext.builder(configure()).build() and ServletDeploymentContext.builder(RestApplication.class).build(); 给了我 HTTP 404 未找到这些以下情况工作正常.. return ServletDeploymentContext.forPackages(HelloWorldService.class.getPackage().getName()).build(); @ 987654342@再次感谢您
    猜你喜欢
    • 2011-05-27
    • 2016-04-25
    • 2012-08-19
    • 1970-01-01
    • 2014-02-20
    • 2011-07-09
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多