2013-07-30 7 views
14

Also versuche ich Jetty in meine Web-Anwendung zu integrieren, so dass jemand, wenn ich es als ein Glas verpacken, einfach die JAR-Datei ausführen kann, ohne sich um die Konfiguration eines Servers kümmern zu müssen. Ich habe jedoch einige Probleme beim Einrichten meiner Hauptklasse, damit der Jetty auf meine Ressourcenklassen zugreifen kann. Ich habe Tutorials angeschaut, aber sie haben mir nicht genau das gegeben, wonach ich suche. Das habe ich bisher.Wie Jetty und Jersey in meine Java-Anwendung einbetten

package pojo; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     Server server = new Server(8080); 
     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); 
     context.setContextPath("/"); 
     ServletHolder h = new ServletHolder(new DefaultServlet()); 
     h.setInitParameter("javax.ws.rs.Application","resources.DBCollection"); 
     context.addServlet(h, "/*"); 
     server.setHandler(context); 
     server.start(); 
     server.join(); 
    } 
} 

Und ich versuche es zu dieser Klasse zuzuordnen:

package resources; 


import java.util.ArrayList; 
import java.util.List; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Request; 
import javax.ws.rs.core.UriInfo; 

import pojo.Party; 

@Path("/parties") 
public class DBCollection { 

    @Context 
    UriInfo url; 

    @Context 
    Request request; 

    String name; 

    @GET 
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
    public List<Party> getAllParties() throws Exception 
    { 
     List<Party> list = new ArrayList<Party>(); 
     list.addAll(DBConnection.getPartyCollection().values()); 
     return list; 
    } 

    @GET 
    @Path("count") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getPartyCount() throws Exception 
    { 
     return String.valueOf(DBConnection.getPartyCollection().size()); 
    } 

    @Path("{party}") 
    public DBResource getParty(@PathParam("party")String party) 
    { 
     return new DBResource(url,request,party); 
    } 
} 

Hier ist meine POM-Datei:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>PartyAPI</groupId> 
    <artifactId>PartyAPIMaven</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <dependencies> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.6</version> 
     </dependency> 
     <dependency> 
      <groupId>com.codahale.metrics</groupId> 
      <artifactId>metrics-core</artifactId> 
      <version>3.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-server</artifactId> 
      <version>1.17.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-server</artifactId> 
      <version>9.0.0.RC0</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-servlet</artifactId> 
      <version>9.0.0.RC0</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-servlets</artifactId> 
      <version>9.0.0.RC0</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.persistence</groupId> 
      <artifactId>eclipselink</artifactId> 
      <version>2.6.0-SNAPSHOT</version> 
     </dependency> 

    </dependencies> 
    <repositories> 
     <repository> 
      <id>oss.sonatype.org</id> 
      <name>OSS Sonatype Staging</name> 
      <url>https://oss.sonatype.org/content/groups/staging</url> 
     </repository> 
    </repositories> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>1.6</version> 
       <configuration> 
        <createDependencyReducedPom>true</createDependencyReducedPom> 
        <filters> 
         <filter> 
          <artifact>*:*</artifact> 
          <excludes> 
           <exclude>META-INF/*.SF</exclude> 
           <exclude>META-INF/*.DSA</exclude> 
           <exclude>META-INF/*.RSA</exclude> 
          </excludes> 
         </filter> 
        </filters> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          <transformers> 
           <transformer 
            implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
           <transformer 
            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
            <manifestEntries> 
             <Main-Class>com.resteasy.Star.Main</Main-Class> 

            </manifestEntries> 

           </transformer> 
          </transformers> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Antwort

20

Ein paar Dinge.

  1. Jetty 9.0.0.RC0 ist ein alter, noch nicht stabil, Release Candidate, sollten Sie auf eine stabile, endgültige Version upgraden, wie 9.0.4.v20130625
  2. Sie brauchen etwas, das das Jax RS Klasse verbinden wird in die Servlet-API. Normalerweise erfolgt dies über ein Servlet oder eine Art Initialisierung mit Ihrer bevorzugten Bibliothek. (In Ihrem case Jersey)

In Ihrem Beispiel haben Sie nur ein Setup DefaultServlet statische Dateien zu dienen, hat sich nichts konfiguriert Ihr DBCollection Objekt zu verwenden.

Für Jersey müssen Sie die org.glassfish.jersey.servlet.ServletContainer konfigurieren und ihre Servlet-Mappings auf einen Kontext Ihrer Wahl einrichten.

Beispiel:

package com.example; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     Server server = new Server(8080); 

     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); 
     context.setContextPath("/"); 
     server.setHandler(context); 

     ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/webapi/*"); 
     jerseyServlet.setInitOrder(1); 
     jerseyServlet.setInitParameter("jersey.config.server.provider.packages","com.example"); 

     ServletHolder staticServlet = context.addServlet(DefaultServlet.class,"/*"); 
     staticServlet.setInitParameter("resourceBase","src/main/webapp"); 
     staticServlet.setInitParameter("pathInfoOnly","true"); 

     try 
     { 
      server.start(); 
      server.join(); 
     } 
     catch (Throwable t) 
     { 
      t.printStackTrace(System.err); 
     } 
    } 
} 

diesem Beispiel wird der ServletContainer das Trikot mit dem ServletContextHandler bereitstellt, die Jetty verwendet zu sehen, was auf der eingehenden Anfrage auf Basis zu tun. Dann ist es die DefaultServlet fügt alle Anforderungen von Inhalten zu behandeln, die Jersey nicht (wie statische Inhalte) behandeln

+0

wenn ich geben Sie localhost: 8111/WebAPI/Parteien Ich erhalte einen Fehler 500 (Anmerkung: ich den Port 8111 geändert, weil ich eine NetBind Exception bekommen), wie kann ich das beheben, dass (kein Stapel Strace gedruckt wird). Außerdem konnte ich Javadocs nicht finden, würde es Ihnen etwas ausmachen zu erklären was setInitParameter macht und was Sie mit "statischem" Inhalt vs Jersey Inhalt meinen. – sreya

+0

Statischer Inhalt ist Inhalt, der nicht dynamisch ist und statisch bleibt, egal wer danach fragt (wie Bilder, Javascript, CSS, etc). Jersey-Ressourcen fallen unter die Dynamic-Content-Szenarien. Dinge, die von Ihrem Code generiert werden, um zurück an den Endbenutzer (Browser) gesendet zu werden. Wie für den Fehler 500, aktualisieren Sie Ihre Frage mit dem StackTrace produziert. Ich weiß auch nicht, dass ich Jersey-Besonderheiten nicht kommentieren kann (da ich sie wirklich nicht kenne. Ich bin ein Jetty-Entwickler) –

+0

Ich bekomme keine Stack-Trace :(, ich gehe davon aus, dass ich das Programm einfach vom Main ausführen kann Klasse oder muss ich aus dem Projektverzeichnis ausführen?Macht das Sinn – sreya

9

Falls Sie wollen das Lebenszyklus Ihrer DBCollection programmatisch Ressource verwalten (zB Sie instanziiert es sich, einige Setup/Initialisierung usw.), anstelle von Jersey für Sie die Instanz erstellen, können Sie eine ResourceConfig wie solche verwenden:

ServletContextHandler sch = new ServletContextHandler(); 
sch.setContextPath("/xxx"); 

TheResource resource = new TheResource(); 
ResourceConfig rc = new ResourceConfig(); 
rc.register(resource); 

ServletContainer sc = new ServletContainer(rc); 
ServletHolder holder = new ServletHolder(sc); 
sch.addServlet(holder, "/*"); 

Server server = new Server(port); 
server.setHandler(sch); 
server.start(); 
server.join(); 

Notiere die Linie TheResource resource = new TheResource();. Hier erstellen wir unsere eigene Instanz von TheResource, und wir können sie jetzt beliebig manipulieren. So

Verwandte Themen