2016-10-25 129 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

    我終於明白了。必須爲類和方法設置路徑註釋。 –