2016-07-31 10 views
0

Ich versuche, mein Projekt mit Jersey einzurichten, um grundsätzlich zwei Servlets zu haben: ein privates für den Zugriff durch die Client-Anwendung und ein öffentliches, das als API fungiert. Die api-Anrufe sind eine Teilmenge der privaten Anrufe. (Falls dies relevant ist, ist meine Client-Seite GWT mit RestyGWT). Meine Ressourcen sind alle gespeichert in entweder:Jersey Einrichten von 2 Servlets

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

Wo der private Servlet diese beiden Pakete umfassen sollte und die api sollte nur das api-paket verwenden.

Ich würde meine interne Anrufe mag so aussehen:

https: // localhost: 8445/resources/Authentifizierung/login

und meine api wie folgt aussehen ruft:

https : // localhost: 8445/api/users/getUser

Meine web.xml wie folgt aussieht:

<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> 

Ich habe die ApiApplication Setup wie folgt aus:

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"); 
    } 
} 

Nun, da ich all das Setup, ich versuche, meinen Dienst zu treffen. Ich bin mit einem DirectRestService der wie folgt aussieht:

@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(); 
} 

Die Server-Ressource, die das wie folgt aussieht implementiert:

@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 
    } 
} 

Wenn ich https besuchen: // localhost: 8445, die findActiveSession () Methode von meinem Client aufgerufen wird, aber ich bekomme einen 404. die URL-Dienst wie in Chrome Netzwerk Monitor angezeigt sieht wie folgt aus:

https: // localhost: 8445/resources/Authentifizierung/findActiveSession

Es ist alles sehr verwirrend, welche Dinge welche Pfade brauchen. Dinge, über die ich mir nicht sicher bin:

Ist der AuthenticationResource-Pfad korrekt? Benötigt es sogar die Path-Annotation?

Ist es richtig, dass das private Servlet die javax.ws.rs.core.Application verwendet?

Richte ich das benutzerdefinierte Servlet ordnungsgemäß mit der Application-Unterklasse (ApiApplication) ein?

+0

haben Sie Ihre Anwendung im Stammkontext des Anwendungsservers bereitgestellt? – JimHawkins

+0

Ihre 'web.xml' sieht seltsam aus. Werfen Sie einen Blick auf [Jersey] (https://jersey.java.net/documentation/latest/deployment.html # deployment.servlet) – JimHawkins

+0

@JimHawkins Im Moment benutze ich das Maven Tomcat Plugin zum Testen. Kannst du mir sagen, was daran komisch aussieht? Die Seite, die du verlinkt hast, ist genau die, die ich benutzt habe, um so weit zu kommen. – Troncoso

Antwort

0

Ich habe endlich eine Lösung gefunden, die funktioniert. Ich weiß nicht, ob es ganz richtig ist, aber es gibt mir die Ergebnisse Ich möchte:

Mein 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> 

ich nicht die Anwendung Subklassen am Ende brauchen haben.

Verwandte Themen