Java Jersey单元测试返回404

Java Jersey单元测试返回404,java,unit-testing,jersey,jersey-client,Java,Unit Testing,Jersey,Jersey Client,我试图让一个简单的单元测试工作,但是它返回404状态 Enpoints等级: @Path("/v1") public class Endpoints { @Context private HttpServletResponse servletResponse; private void allowCrossDomainAccess() { if (servletResponse != null){ servletResponse

我试图让一个简单的单元测试工作,但是它返回404状态

Enpoints等级:

@Path("/v1")
public class Endpoints {

    @Context
    private HttpServletResponse servletResponse;

    private void allowCrossDomainAccess() {
        if (servletResponse != null){
            servletResponse.setHeader("Access-Control-Allow-Origin", "*");
        }
    }

    @GET
    @Path("/whoami")
    @Produces(MediaType.APPLICATION_JSON)
    public String whoami(@Context final HttpServletRequest request){
        allowCrossDomainAccess();

        // Extract the software version from the user agent 
        final String userAgent = request.getHeader("user-agent");
        final Pattern pattern = Pattern.compile("\\((.+?)\\)"); // Regex to extract anything between opening and closing curly bracers
        final Matcher matcher = pattern.matcher(userAgent);
        matcher.find();
        final String software = matcher.group(1);

        final String ipAddress; 
        if (request.getHeader("X-Forwarded-For") != null){ // Heroku adds this header
            ipAddress = request.getHeader("X-Forwarded-For");
        } else {
            ipAddress = request.getRemoteAddr();
        }

        final JSONObject json = new JSONObject();
        json.put("ipaddress", ipAddress);
        json.put("locale", request.getLocale());
        json.put("software", software);

        return json.toString(4);
    }

}
我的测试班:

public class EndpointsTest extends JerseyTest {

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

    @Test
    public void parseHeadersTest() {
        Response output = target().path("/api/v1/whoami").request().get();
        System.out.println("response: " + output);
        assertEquals(200, output.getStatus());
    }
}
输出:

Jul 15, 2016 2:30:37 PM org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory$GrizzlyTestContainer <init>
INFO: Creating GrizzlyTestContainer configured at the base URI http://localhost:9998/
Jul 15, 2016 2:30:37 PM org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [localhost:9998]
Jul 15, 2016 2:30:37 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
response: InboundJaxrsResponse{context=ClientResponse{method=GET, uri=http://localhost:9998/api/v1/whoami, status=404, reason=Not Found}}
Jul 15, 2016 2:30:37 PM org.glassfish.grizzly.http.server.NetworkListener shutdownNow
INFO: Stopped listener bound to [localhost:9998]
WEB-INF/WEB.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">

    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.rich.fcc</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

Jersey Web应用程序
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
org.rich.fcc
1.
Jersey Web应用程序
/原料药/*

我们可能需要查看您的配置。似乎服务器在单元测试期间启动时没有注册终结点。@sdotdi我已经编辑了这个问题,以包含我认为相关的所有内容。当我设置
响应输出=目标().path(“/v1/whoami”).request().get()时,将
/api
放到
路径(…)
@peeskillet中
响应是:
response:inboundjaxrssponse{context=ClientResponse{method=GET,uri=http://localhost:9998/v1/whoami,status=500,reason=Request失败。}
。您需要修复服务器端的错误。至少现在您实际正在访问服务器,我们可能需要查看您的配置。似乎服务器在单元测试期间启动时没有注册终结点。@sdotdi我已经编辑了这个问题,以包含我认为相关的所有内容。当我设置
响应输出=目标().path(“/v1/whoami”).request().get()时,将
/api
放到
路径(…)
@peeskillet中
响应是:
response:inboundjaxrssponse{context=ClientResponse{method=GET,uri=http://localhost:9998/v1/whoami,status=500,reason=Request失败。}
。您需要修复服务器端的错误。至少现在你真的在攻击服务器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">

    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.rich.fcc</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>