2016-10-25 81 views
2

我正在尝试编写一个提供HTML和REST接口的Java Web应用程序。我想创建一个使用JSP提供HTML接口的servlet,但数据也应该可以通过REST访问。Java EE Servlet和REST路径冲突

我已经是这样了REST:

@javax.ws.rs.Path("/api/") 
public class RestAPI { 

    ... // Some methods 
} 

@WebServlet("/servlet") 
public class MyServlet extends HttpServlet { 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    resp.getWriter().write("Howdy at "); 
    } 
} 

现在,当我改变@WebServlet( “/ servlet的”)注释@WebServlet( “/”),servlet可能因与REST路径冲突而停止工作。

如何在根中的特定路径和HTML中提供REST?

谢谢 卢卡斯Jendele

+0

顺便说一句,应该可以通过JAX-RS为HTML接口提供服务。实际上,应该甚至可以在与API完全相同的URL上提供HTML接口 - 我没有使用Swarm进行尝试,但是我已经在Jetty + Jersey上看到了它,所以我无法看到为什么它不能与Swarm一起使用。 – Ladicek

回答

2

这似乎为我工作确定。我做了什么:

  1. 在我pom.xml,我有org.wildfly.swarm:undertow(对Servlet API中)和org.wildfly.swarm:jaxrs(用于JAX-RS)的依赖。当然还有Swarm Maven插件。

  2. 对于小服务程序,我仅这一个类:

@WebServlet("/") 
public class HelloServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     resp.getWriter().println("Hello from servlet"); 
    } 
} 
  • 对于JAX-RS,我有这些2类:
  • @ApplicationPath("/api") 
    public class RestApplication extends Application { 
    } 
    
    @Path("/") 
    public class HelloResource { 
        @GET 
        public Response get() { 
         return Response.ok().entity("Hello from API").build(); 
        } 
    } 
    

    为了测试,我跑curl http://localhost:8080/curl http://localhost:8080/api。结果如预期。 (也许我的例子太简单了吧?)

    +0

    谢谢!我尝试了你发布的唯一区别是我使用gradle而不是maven。它不起作用。我在问题中包含了gradle和main文件,所以你可以看看。 –

    +0

    非常感谢。问题是我错过了RestApplication类。你发布的例子效果很好。是否可以在一个类中指定多个GET方法,并为该方法指定@@ Path而不是该类?我尝试将Path注释移动到该方法,但是,这对我不起作用。 –

    +0

    我终于明白了。必须为类和方法设置路径注释。 –