如何将Jetty和Jersey嵌入到我的Java应用程序中
所以我试图将jetty嵌入到我的Web应用程序中,这样如果我把它打包成jar,就可以运行jar文件而不必担心配置服务器。 但是,我在设置主类时遇到了一些问题,因此jetty可以访问我的资源类。 我看过教程,但他们没有给我我正在寻找的东西。 这就是我到目前为止所拥有的。
package pojo; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class Main { public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); context.setContextPath("/"); ServletHolder h = new ServletHolder(new DefaultServlet()); h.setInitParameter("javax.ws.rs.Application","resources.DBCollection"); context.addServlet(h, "/*"); server.setHandler(context); server.start(); server.join(); } }
我正在尝试将它映射到这个类:
package resources; import java.util.ArrayList; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.UriInfo; import pojo.Party; @Path("/parties") public class DBCollection { @Context UriInfo url; @Context Request request; String name; @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public List getAllParties() throws Exception { List list = new ArrayList(); list.addAll(DBConnection.getPartyCollection().values()); return list; } @GET @Path("count") @Produces(MediaType.TEXT_PLAIN) public String getPartyCount() throws Exception { return String.valueOf(DBConnection.getPartyCollection().size()); } @Path("{party}") public DBResource getParty(@PathParam("party")String party) { return new DBResource(url,request,party); } }
这是我的POM文件:
4.0.0 PartyAPI PartyAPIMaven 0.0.1-SNAPSHOT jar mysql mysql-connector-java 5.1.6 com.codahale.metrics metrics-core 3.0.1 com.sun.jersey jersey-server 1.17.1 org.eclipse.jetty jetty-server 9.0.0.RC0 compile org.eclipse.jetty jetty-servlet 9.0.0.RC0 compile org.eclipse.jetty jetty-servlets 9.0.0.RC0 compile org.eclipse.persistence eclipselink 2.6.0-SNAPSHOT oss.sonatype.org OSS Sonatype Staging https://oss.sonatype.org/content/groups/staging org.apache.maven.plugins maven-shade-plugin 1.6 true *:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA package shade com.resteasy.Star.Main
一些东西。
- Jetty 9.0.0.RC0是一个旧的,尚未稳定的候选版本,考虑升级到稳定的最终版本,例如9.0.4.v20130625
- 您需要将Jax RS类连接到servlet api的东西。 通常通过Servlet或使用您选择的库进行某种初始化来完成。 (在你的情况下泽西岛)
在您的示例中,您只设置了一个DefaultServlet
来提供静态文件,没有任何配置使用您的DBCollection
对象。
对于Jersey,您需要配置org.glassfish.jersey.servlet.ServletContainer
并在您选择的上下文中设置其servlet-mappings。
例:
package com.example; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class Main { public static void main(String[] args) { Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); context.setContextPath("/"); server.setHandler(context); ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/webapi/*"); jerseyServlet.setInitOrder(1); jerseyServlet.setInitParameter("jersey.config.server.provider.packages","com.example"); ServletHolder staticServlet = context.addServlet(DefaultServlet.class,"/*"); staticServlet.setInitParameter("resourceBase","src/main/webapp"); staticServlet.setInitParameter("pathInfoOnly","true"); try { server.start(); server.join(); } catch (Throwable t) { t.printStackTrace(System.err); } } }
此示例将jersey提供的ServletContainer添加到Jetlet用于根据传入请求查找要执行的操作的ServletContextHandler。 然后它添加DefaultServlet来处理Jersey不处理的内容的任何请求(例如静态内容)
如果您想以编程方式完全管理DBCollection
资源的生命周期(例如,您自己实例化,进行一些设置/初始化等),而不是让Jersey为您创建实例,您可以使用如下的ResourceConfig
:
ServletContextHandler sch = new ServletContextHandler(); sch.setContextPath("/xxx"); TheResource 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();
注意行TheResource resource = new TheResource();
。 在这里,我们创建了自己的TheResource实例,我们现在可以随意操作它。
- 在Jetty中运行的Web应用程序中使用CAC(通用访问卡)对用户进行身份validation,以获取美国政府机构使用的应用程序
- Maven依赖冲突:org.w3c.dom.ElementTraversal
- 如何在Jetty类路径中将jar放入jetty / lib?
- Jetty mysql连接池配置错误:javax.naming.NameNotFoundException; 剩余名称’env / jdbc / —(mysql 5.0 + jetty 7.0.1)
- 如何在jetty中启用日志记录?
- 使用ShutdownHandler关闭docker
- 连接到安全的websocket
- 程序化Jetty关闭
- 使用jackson将json反序列化为java – 特殊字符问题