创建一个与默认 Jetty 的 Jersey 注册行为相同的 ResourceConfig
Creating a ResourceConfig that behaves the same way as default Jetty's Jersey registering
我有一个端点:
@POST
@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String canaryTest(String JSON) {
return JSON;
}
当我使用 Jersey 在 Jetty 中注册它时
ServletHolder holder = new ServletHolder(new ServletContainer());
似乎一切正常。
但如果我尝试明确指定默认配置,它就会停止工作(从端点返回媒体类型错误)。即使只是将 ResourceConfig 的默认实例传递给 ServletContainer,它也会停止工作。
ResourceConfig config = new ResourceConfig();
//config.property(x,defaultX)
//config.property(y,defaultY)
ServletHolder holder = new ServletHolder(new ServletContainer(config));
我想手动和明确地模拟默认配置行为,所以我在这里问的是我应该如何配置 ResourceConfig 以使行为继续工作(即要设置哪些属性)
P.S:我正在使用 Jetty 9.2.6.v20141205 和 Jersey 2.14。
Maven 中的依赖项:
- org.eclipse.jetty.jetty-服务器org.eclipse.jetty.jetty-servlet
- org.eclipse.jetty.jetty-servlets
- org.glassfish.jersey.containers.jersey-container-servlet-core
- com.sun.jersey.jersey-json
- org.glassfish.jersey.media.jersey-媒体-json-杰克逊
我不知道你是怎么做到的
ServletHolder holder = new ServletHolder(new ServletContainer());
我无法生成一个简单实例化 ServletContainer()
的工作示例。虽然我正要让它与以下代码一起工作
public class TestJerseyServer {
public static void main(String[] args) throws Exception {
ResourceConfig config = new ResourceConfig();
config.packages("jetty.practice.resources");
ServletHolder jerseyServlet
= new ServletHolder(new ServletContainer(config));
Server server = new Server(8080);
ServletContextHandler context
= new ServletContextHandler(server, "/");
context.addServlet(jerseyServlet, "/*");
server.start();
server.join();
}
}
使用所有依赖项,不包括 com.sun.jersey:jersey-json
,因为不需要。没有其他配置。资源 class
@Path("test")
public class TestResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getTest() {
Hello hello = new Hello();
hello.hello = "world";
return Response.ok(hello).build();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postHello(Hello hello) {
return Response.ok(hello.hello).build();
}
public static class Hello {
public String hello;
}
}
在 jetty.practice.resources
包中。
我很好奇你是如何在没有 ResourceConfig
的情况下工作的
我应该提到的另一件事是 jersey-container-servlet-core
应该换成 jersey-container-servlet
。前者用于 2.5 容器支持,而后者推荐用于 3.x 容器。但它没有任何效果,以我的例子
cURL
C:\>curl http://localhost:8080/test -X POST -d "{\"hello\":\"world\"}" -H "Content-Type:application/json"
world
C:\>curl http://localhost:8080/test
{"hello":"world"}
我有一个端点:
@POST
@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String canaryTest(String JSON) {
return JSON;
}
当我使用 Jersey 在 Jetty 中注册它时
ServletHolder holder = new ServletHolder(new ServletContainer());
似乎一切正常。 但如果我尝试明确指定默认配置,它就会停止工作(从端点返回媒体类型错误)。即使只是将 ResourceConfig 的默认实例传递给 ServletContainer,它也会停止工作。
ResourceConfig config = new ResourceConfig();
//config.property(x,defaultX)
//config.property(y,defaultY)
ServletHolder holder = new ServletHolder(new ServletContainer(config));
我想手动和明确地模拟默认配置行为,所以我在这里问的是我应该如何配置 ResourceConfig 以使行为继续工作(即要设置哪些属性)
P.S:我正在使用 Jetty 9.2.6.v20141205 和 Jersey 2.14。 Maven 中的依赖项:
- org.eclipse.jetty.jetty-服务器org.eclipse.jetty.jetty-servlet
- org.eclipse.jetty.jetty-servlets
- org.glassfish.jersey.containers.jersey-container-servlet-core
- com.sun.jersey.jersey-json
- org.glassfish.jersey.media.jersey-媒体-json-杰克逊
我不知道你是怎么做到的
ServletHolder holder = new ServletHolder(new ServletContainer());
我无法生成一个简单实例化 ServletContainer()
的工作示例。虽然我正要让它与以下代码一起工作
public class TestJerseyServer {
public static void main(String[] args) throws Exception {
ResourceConfig config = new ResourceConfig();
config.packages("jetty.practice.resources");
ServletHolder jerseyServlet
= new ServletHolder(new ServletContainer(config));
Server server = new Server(8080);
ServletContextHandler context
= new ServletContextHandler(server, "/");
context.addServlet(jerseyServlet, "/*");
server.start();
server.join();
}
}
使用所有依赖项,不包括 com.sun.jersey:jersey-json
,因为不需要。没有其他配置。资源 class
@Path("test")
public class TestResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getTest() {
Hello hello = new Hello();
hello.hello = "world";
return Response.ok(hello).build();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postHello(Hello hello) {
return Response.ok(hello.hello).build();
}
public static class Hello {
public String hello;
}
}
在 jetty.practice.resources
包中。
我很好奇你是如何在没有 ResourceConfig
我应该提到的另一件事是 jersey-container-servlet-core
应该换成 jersey-container-servlet
。前者用于 2.5 容器支持,而后者推荐用于 3.x 容器。但它没有任何效果,以我的例子
cURL
C:\>curl http://localhost:8080/test -X POST -d "{\"hello\":\"world\"}" -H "Content-Type:application/json"
world
C:\>curl http://localhost:8080/test
{"hello":"world"}