将 Jetty 与 RESTEasy 集成
Posted
技术标签:
【中文标题】将 Jetty 与 RESTEasy 集成【英文标题】:Integrating Jetty with RESTEasy 【发布时间】:2012-04-22 08:21:28 【问题描述】:关于如何集成 Jetty 和 RESTEasy 的任何链接?我在尝试将 RESTEasy 与 Jetty 一起配置时有点卡住了……而且似乎在网络上没有可靠的帮助。
public static void main(String[] args) throws Exception
Server server = new Server(8080);
WebAppContext context = new WebAppContext();
context.setDescriptor("../WEB-INF/web.xml");
context.setResourceBase("../src/webapp");
context.setContextPath("/");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
server.join();
我的 Web.xml 直接复制自: http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Installation_Configuration.html
当我尝试打开资源文件中的链接时,返回的错误是 HTTP 404。一切表面上看起来都很合理,有什么建议吗?
我的资源文件如下:
package webapp;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/*")
public class Resource
@GET
public String hello()
return "hello";
@GET
@Path("/books")
public String getBooks()
return "books";
@GET
@Path("/book/isbn")
public String getBook(@PathParam("isbn") String id)
return "11123";
这是我在 Jetty 启动时看到的打印:
2012-04-10 09:54:27.163:INFO:oejs.Server:jetty-8.1.1.v20120215 2012-04-10 09:54:27.288:INFO:oejw.StandardDescriptorProcessor:NO JSP 支持 /,没有找到 org.apache.jasper.servlet.JspServlet 2012-04-10 09:54:27.319:INFO:oejsh.ContextHandler:started oejwWebAppContext/,file:/C:/Users/xyz/Anotherproj1/src/webapp 2012-04-10 09:54:27.319:INFO:oejsh.ContextHandler:started oejwWebAppContext/,file:/C:/Users/xyz/Anotherproj1/src/webapp 2012-04-10 09:54:27.381 :INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
【问题讨论】:
乍一看,这看起来是正确的。您使用的是哪个 Jetty 版本。是否有任何错误信息?你到底有什么问题? @andih 当我尝试打开资源文件中的链接时,该错误本质上是 HTTP 404。 @andih 我正在使用 Jetty 8.1.1 如果其他人遇到这个老问题:github.com/snackunderflow/MoonBase/blob/master/LunarCat/src/… 【参考方案1】:你确定@Path("/*") 是正确的路径吗?试试 @Path("/") 也许这个 * 是个问题。据我所知,路径表达式不接受正则表达式。
编辑
我错了,你可以在@Path 中使用正则表达式,至少RESTEasy supports that。
【讨论】:
试过了,没用。当我输入 localhost:8080/ 时,我在浏览器中找不到 404【参考方案2】:以下对我有用:
web.xml:
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>resteasy.resources</param-name>
<param-value>webapp.Resource</param-value>
</context-param>
<context-param>
<param-name>javax.ws.rs.core.Application</param-name>
<param-value>webapp.MyApplicationConfig</param-value>
</context-param>
<!-- set this if you map the Resteasy servlet to something other than /*
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/resteasy</param-value>
</context-param>
-->
<!-- if you are using Spring, Seam or EJB as your component model, remove the ResourceMethodSecurityInterceptor -->
<context-param>
<param-name>resteasy.resource.method-interceptors</param-name>
<param-value>
org.jboss.resteasy.core.ResourceMethodSecurityInterceptor
</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
与
public class MyApplicationConfig extends Application
private static final Set<Class<?>> CLASSES;
static
HashSet<Class<?>> tmp = new HashSet<Class<?>>();
tmp.add(Resource.class);
CLASSES = Collections.unmodifiableSet(tmp);
@Override
public Set<Class<?>> getClasses()
return CLASSES;
资源
package webapp;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("/")
@Produces("text/plain")
public class Resource
@GET
public String hello()
return "hello";
@GET
@Path("/books")
public String getBooks()
return "books";
@GET
@Path("/book/isbn")
public String getBook(@PathParam("isbn") String id)
return "11123";
和主类
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap;
public class Main
public static void main(String[] args) throws Exception
Server server = new Server(8080);
WebAppContext context = new WebAppContext();
context.setDescriptor("./src/main/webapp/WEB-INF/web.xml");
context.setResourceBase("./src/main/webapp");
context.setContextPath("/");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
server.join();
【讨论】:
非常感谢,效果很好!只有一件事,您的 web.xml 文件中有错字 - 它应该是“ResteasyBootstrap”,而不是“ResteasyBootstap” - 缺少“r”。【参考方案3】:要让 RESTEasy 和 Jetty没有 web.xml 一起工作,请确保您在 pom.xml 中依赖于 resteasy-servlet-initializer。
这可能会有所帮助(JBoss RESTEasy 文档):https://docs.jboss.org/resteasy/docs/3.0.4.Final/userguide/html/Installation_Configuration.html#d4e111
【讨论】:
以上是关于将 Jetty 与 RESTEasy 集成的主要内容,如果未能解决你的问题,请参考以下文章
Springboot 与 RestEasy 集成并部署到 Jboss 服务器
Rest easy 3 + Jackson + Tomcat + XML 响应
RESTEASY003900:找不到公共构造函数 - 我错过了啥?
RESTEasy:@FormParam@PathParam@QueryParam@HeaderParam@CookieParam@MatrixParam说明