请帮助我们,我在这里疯了......
所以我试图在嵌入式码头(9.2.14.v20151106)中使用jersey(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
:
@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/ 中调用它,它将从该类的第一个方法返回纯文本 TestClass.class ,但如果我在链接中添加了更多路径,它将只返回相同的字符串,我无法调用它来显示 TestServlet 类或 TestServlet2 的第二种方法。< / p>
但是,如果将 TestServlet 的路径从 @Path(“/”)更改为除此之外的任何内容,则只返回包含<的任何URL的错误404强> http://localhost:8080/ 即可。我尝试了一切我能想到的原因但无济于事,而且令人沮丧。我在这里错过了什么吗?
...谢谢
答案 0 :(得分:2)
这里context.addServlet(sh, "/");
告诉你要访问servlet的路径是什么。因此,您拥有的唯一接入点是/
。如果您想要访问&#34; /
&#34; 之后的任何内容,则应添加通配符*
。所以只需将其更改为.addServlet(sh, "/*");