将 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 服务器

OSGi 应用程序内的 REST 客户端

Rest easy 3 + Jackson + Tomcat + XML 响应

将 Jetty 与 JAX-RS-Jersey 集成

RESTEASY003900:找不到公共构造函数 - 我错过了啥?

RESTEasy:@FormParam@PathParam@QueryParam@HeaderParam@CookieParam@MatrixParam说明