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?
haben Sie Ihre Anwendung im Stammkontext des Anwendungsservers bereitgestellt? – JimHawkins
Ihre 'web.xml' sieht seltsam aus. Werfen Sie einen Blick auf [Jersey] (https://jersey.java.net/documentation/latest/deployment.html # deployment.servlet) – JimHawkins
@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