Jersey Jetty Embedded 无法读取路径注释,错误 404
Jersey Jetty Embedded Won't Read Path Annotation, Error 404
请大家帮帮我,我快疯了..
所以我尝试在嵌入式码头 (9.2.14.v20151106) 中使用球衣 (2.22.1),使用非常简单的主应用程序,如下所示:
public class MainApp{
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
ServletHolder sh = new ServletHolder(ServletContainer.class);
sh.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "etc.mypackage");
sh.setInitParameter(ServerProperties.PROVIDER_SCANNING_RECURSIVE, "true");
sh.setInitParameter(ServerProperties.TRACING, "ALL");
sh.setInitParameter("jersey.config.server.tracing", "ALL");
sh.setInitOrder(1);
sh.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
context.addServlet(sh, "/");
server.start();
server.join();
}
}
这里不起作用的一件事是球衣追踪似乎不起作用,即使我在参数中设置它也是如此。
我在 etc.mypackage.servlets
有 2 个 servlet:
@Path("/")
public class TestServlet {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String testString){ return "TestServlet.class; }
@Path("test1")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getString(){
String test = "TestServlet.class second method called";
return test;
}
}
另一个功能相同但路径和调试字符串不同:
@Path("/2")
public class TestServlet2 {
@Path("/test1")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String testString){ return "TestServlet2.class; }
@Path("test2")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getString(){
String test = "TestServlet2.class second method called";
return test;
}
}
这些代码 运行 如果在 http://localhost:8080/ 中调用它,它将 return 纯文本 TestClass.class 来自那个 class 的第一个方法,但是如果我在 link 中添加更多路径,它将只是 return 相同的字符串,我没办法可以调用它来显示 TestServlet class 或 TestServlet2.
的第二种方法
但是如果将 TestServlet 的路径从 @Path("/") 更改为除此之外的任何路径,它只会 return 任何 URL 的错误 404,包括 http://localhost:8080/。我尝试了所有我能想到的原因,但无济于事,这太令人沮丧了。我在这里错过了什么吗?
谢谢...
此处 context.addServlet(sh, "/");
您要指定要匹配的访问 servlet 的路径。所以你唯一的访问点是 /
。如果您想访问 "anything after /
",您应该添加通配符 *
。所以只需将其更改为 .addServlet(sh, "/*");
请大家帮帮我,我快疯了..
所以我尝试在嵌入式码头 (9.2.14.v20151106) 中使用球衣 (2.22.1),使用非常简单的主应用程序,如下所示:
public class MainApp{
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
ServletHolder sh = new ServletHolder(ServletContainer.class);
sh.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "etc.mypackage");
sh.setInitParameter(ServerProperties.PROVIDER_SCANNING_RECURSIVE, "true");
sh.setInitParameter(ServerProperties.TRACING, "ALL");
sh.setInitParameter("jersey.config.server.tracing", "ALL");
sh.setInitOrder(1);
sh.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
context.addServlet(sh, "/");
server.start();
server.join();
}
}
这里不起作用的一件事是球衣追踪似乎不起作用,即使我在参数中设置它也是如此。
我在 etc.mypackage.servlets
有 2 个 servlet:
@Path("/")
public class TestServlet {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String testString){ return "TestServlet.class; }
@Path("test1")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getString(){
String test = "TestServlet.class second method called";
return test;
}
}
另一个功能相同但路径和调试字符串不同:
@Path("/2")
public class TestServlet2 {
@Path("/test1")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String testString){ return "TestServlet2.class; }
@Path("test2")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getString(){
String test = "TestServlet2.class second method called";
return test;
}
}
这些代码 运行 如果在 http://localhost:8080/ 中调用它,它将 return 纯文本 TestClass.class 来自那个 class 的第一个方法,但是如果我在 link 中添加更多路径,它将只是 return 相同的字符串,我没办法可以调用它来显示 TestServlet class 或 TestServlet2.
的第二种方法但是如果将 TestServlet 的路径从 @Path("/") 更改为除此之外的任何路径,它只会 return 任何 URL 的错误 404,包括 http://localhost:8080/。我尝试了所有我能想到的原因,但无济于事,这太令人沮丧了。我在这里错过了什么吗?
谢谢...
此处 context.addServlet(sh, "/");
您要指定要匹配的访问 servlet 的路径。所以你唯一的访问点是 /
。如果您想访问 "anything after /
",您应该添加通配符 *
。所以只需将其更改为 .addServlet(sh, "/*");