2016-07-31 37 views
0

我想用Jersey設置我的項目,基本上有2個servlet:一個用於客戶端應用程序訪問的私有應用程序和一個用作API的公共應用程序。 api調用是私有調用的一個子集。 (如果這是相關的,我的客戶端是GWT和RestyGWT)。我的資源都存儲在任一:Jersey設置2個servlet

com.path.to.server.resources.internal
com.path.to.server.resources.api

凡私人的servlet應該包括這兩個包,並且api只能使用api包。

我想我的內部調用看起來像這樣:

的https://本地主機:8445 /資源/認證/註冊

和我的API調用看起來像這樣:

HTTPS ://本地主機:8445/API /用戶/的getUser

我的web.xml文件看起來是這樣的:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 

    <!-- Servlets --> 
    <servlet> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>com.path.to.server.resources.exceptionmappers;com.path.to.server.resources.api;com.path.to.server.resources.internal</param-value> 
     </init-param> 
    </servlet> 

    <servlet> 
     <servlet-name>com.path.to.server.ApiApplication</servlet-name> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <url-pattern>/resources/*</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>com.path.to.server.ApiApplication</servlet-name> 
     <url-pattern>/api</url-pattern> 
    </servlet-mapping> 

</web-app> 

我有ApiApplication設置是這樣的:

public class ApiApplication extends ResourceConfig 
{ 
    public ApiApplication() 
    { 
     System.out.println("SETTING UP API"); 
     packages("com.path.to.server.resources.exceptionmappers;com.path.to.server.resources.api"); 
    } 
} 

現在,我有所有的設置,我試圖打我的服務。我使用的是DirectRestService,看起來像這樣:

@Path("resources/authentication") 
public interface AuthenticationService extends BaseService 
{ 
    @POST 
    @Path("/login/{loginType}") 
    @Produces(MediaType.APPLICATION_JSON) 
    Session login(@HeaderParam("Authorization") String authorization, @PathParam("loginType") UserTypes loginType); 

    @POST 
    @Path("/findActiveSession") 
    @Produces(MediaType.APPLICATION_JSON) 
    Session findActiveSession(); 
} 

實現看起來像這樣的服務器資源:

@Path("authentication") 
public class AuthenticationResource extends BaseResource implements AuthenticationService 
{ 
    public Session login(String authorization, UserTypes loginType) 
    { 
     // Code to do stuff 
    } 

    public Session findActiveSession() 
    { 
     // Code to do stuff 
    } 
} 

當我訪問https://開頭本地主機:8445,在findActiveSession( )方法是從我的客戶端調用,但我得到一個404的服務網址如圖Chrome的網絡監視器看起來是這樣的:

的https://本地主機:8445 /資源/認證/ findActiveSession

關於哪些東西需要什麼路徑,這一切都非常混亂。我不確定的事情:

AuthenticationResource路徑是否正確?它甚至需要Path註釋嗎?

專用servlet使用javax.ws.rs.core.Application是否正確?

我是否正確設置了應用程序子類(ApiApplication)的自定義servlet?

+0

您是否將應用程序部署到應用程序服務器的根上下文中? – JimHawkins

+0

你的'web.xml'看起來很奇怪。看看[Jersey](https://jersey.java。net/documentation/latest/deployment.html#deployment.servlet) – JimHawkins

+0

@JimHawkins現在,我正在使用maven tomcat插件進行測試。你能告訴我什麼看起來很奇怪嗎?你鏈接的頁面是我用來獲得這個目標的確切的一個。 – Troncoso

回答

0

我終於想出了一個正在工作的解決方案。我不知道這是否是完全正確的,但它給我我想要的結果:

我的web.xml

<web-app id="WebApp_ID" version="3.0" [...]> 
    <!-- Servlet for direct client/server calls --> 
    <servlet> 
     <servlet-name>EcoPortalApplication</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value> 
       path.to.server.resources.exceptionmappers,path.to.server.resources.api,path.to.server.resources.internal 
      </param-value> 
     </init-param> 
    </servlet> 

    <!-- Servlet for API calls --> 
    <servlet> 
     <servlet-name>ApiApplication</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value> 
       path.to.server.resources.exceptionmappers,path.to.server.resources.api 
      </param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>EcoPortalApplication</servlet-name> 
     <url-pattern>/resources/*</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>ApiApplication</servlet-name> 
     <url-pattern>/api/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

我沒有最終需要的應用程序的子類。