相当于以下Jersey/Jetty代码的CXF/Jetty [英] CXF/Jetty equivalent of the following Jersey/Jetty code
问题描述
我有一些针对Jersey(2.7)和Jetty(9.2.5.v2014112)的测试代码,我想移植到CXF(3.0.x)和Jetty(相同版本).有一个我无法弄清的部分,等同于下面的rc.register(resource)
行:
I've got some test code with Jersey (2.7) and Jetty (9.2.5.v2014112) that I'm trying to port to CXF (3.0.x) and Jetty (same version). There's one part that I can't figure out, the equivalent of the rc.register(resource)
line below:
ServletContextHandler sch = new ServletContextHandler();
sch.setContextPath("/xxx");
resource = new TheResource();
ResourceConfig rc = new ResourceConfig();
rc.register(resource);
ServletContainer sc = new ServletContainer(rc);
ServletHolder holder = new ServletHolder(sc);
sch.addServlet(holder, "/*");
Server server = new Server(port);
server.setHandler(sch);
server.start();
server.join();
对于CXF/码头案,我知道我需要做类似的事情:
For the CXF/Jetty case I know I need to do something like:
CXFNonSpringJaxrsServlet context = new CXFNonSpringJaxrsServlet();
// EQUIVALENT OF:
// ResourceConfig rc = new ResourceConfig();
// rc.register(myresource)
// SOMETHING.setResourceConfig(rc)
ServletHolder holder = new ServletHolder(context);
ServletContextHandler handler = new ServletContextHandler("/restroot");
handler.addServlet(holder, "/*");
// Using ContextHandlerCollection cos my jetty needs to serve more
// than just this REST service
ContextHandlerCollection collection = new ContextHandlerCollection();
collection.addHandler(handler);
Server server = new Server(8080);
server.setHandler(collection);
server.start();
server.join();
有人知道如何/是否可行?
Does anybody know how/if this is possible?
只是为了澄清我在这里要做的事情:我正在尝试在嵌入式Jetty实例上发布JAX-RS服务,并且我需要完全控制来控制JAX的生命周期-RS bean.
Just to clarify what I'm trying to do here: I'm trying to publish a JAX-RS service on an embedded Jetty instance, and I need full control over the lifecycle of the JAX-RS bean.
马尔滕
推荐答案
从CXF 3.0.4版开始,CXFNonSpringJaxrsServlet
上还有其他构造函数,使此操作变得更加容易:
From CXF version 3.0.4 onwards, there are additional constructors on the CXFNonSpringJaxrsServlet
that make this a lot easier:
public SNAPSHOTApp(int port) throws Exception {
resource = new TheResource();
Set<Object> resourceSingletons = new HashSet<>();
resourceSingletons.add(resource);
CXFNonSpringJaxrsServlet context = new CXFNonSpringJaxrsServlet(resourceSingletons);
ServletHolder servlet = new ServletHolder(context);
ServletContextHandler handler = new ServletContextHandler();
handler.addServlet(servlet, "/*");
handler.setContextPath("/snapshot");
Server server = new Server(port);
server.setHandler(handler);
server.start();
server.join();
}
非常感谢@Sergey Beryozkin根据我在CXF用户邮件列表中的问题添加了此内容.
Big thanks to @Sergey Beryozkin for adding this based on my question on the CXF user mailing list.
这篇关于相当于以下Jersey/Jetty代码的CXF/Jetty的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!