2013-07-30 27 views
14

Web sitemde iskeleyi yerleştirmeye çalışıyorum, böylece bir kavanoz olarak paketlediğimde, bir sunucuyu yapılandırma hakkında endişelenmenize gerek kalmadan kavanoz dosyasını çalıştırabilirim. Ancak, ana sınıfımı kurarken bazı problemlerim var, böylece iskeleler kaynak sınıflarıma erişebiliyorlar. Derslere baktım ama tam olarak aradığım şeyi vermediler. Şimdiye kadar sahip olduğum şey bu.Jetty ve Jersey'i Java uygulamamıza nasıl yerleştiririm?

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

Ve bu sınıfa eşlemek çalışıyorum:

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

cevap

20

birkaç nokta:

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

İşte benim POM dosya.

  1. İskele 9.0.0.RC0 eski değil, henüz istikrarlı, sürüm adayı,
  2. gibi 9.0.4.v20130625 Sen içine Jax RS sınıfını bağlayacak bir şeye ihtiyacım, istikrarlı, nihai sürüme yükseltme düşünün olduğunu sunucu api. Genellikle bir Servlet veya seçim kütüphaneniz ile bir çeşit başlatma ile yapılır. Örnekte

(Sende Jersey harfe), statik dosyalarının sunulması sadece kurulum bir DefaultServlet var, hiçbir şey DBCollection nesneyi kullanmak üzere yapılandırıldı.

Jersey için, org.glassfish.jersey.servlet.ServletContainer'u yapılandırmanız ve kendi sunucu eşlemelerini istediğiniz bir bağlamda ayarlamanız gerekir.

Örnek:

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

Bu örnek forması İskelesi gelen talepleri baz alarak yapmak ne aramak için kullandığı ServletContextHandler sağladığı ServletContainer ekler. Daha sonra, Jersey'in işlem yapmadığı içerik isteklerini (statik içerik gibi) işlemek için DefaultServlet'i ekler (örneğin, statik içerik)

+0

Localhost: 8111/webapi/party girdiğimde 500 hata alıyorum (Not: NetBind Exception alıyorum çünkü bağlantı noktasını 8111 olarak değiştirdim), bunu nasıl düzeltirim (stack strace yazdırılmaz). Ayrıca, javadocs bulamadım, setInitParameter'ın ne yaptığını ve jersey içeriğine göre "statik" içerikten ne kastettiğinizi açıklar mısınız? – sreya

+0

Statik içerik dinamik olmayan içeriğidir ve kimin için sorun olursa olsun statik kalır. görüntüler, javascript, css, vb. Jersey kaynakları Dinamik içerik senaryolarının altına düşer. Kodunuzun oluşturduğu şeyler son kullanıcıya (tarayıcıya) geri gönderilecek. Hata 500'e gelince, sorunuzu üretilen stacktrace ile güncelleyin. Ayrıca Jersey özellikleri hakkında yorum yapamayacağımı biliyorum (gerçekten onları bilmediğim gibi. Ben bir Jetty geliştiricisiyim) –

+0

Yığın izi alamıyorum :(, programı ana bilgisayardan çalıştırabilirim. sınıf mı yoksa proje dizininden mi koşmam gerekiyor?Bu – sreya

9

DBCollection kaynağınızın yaşam döngüsünü programsal olarak tamamen yönetmek istiyorsanız (örneğin, kendiniz başlattığınızda, bazı kurulumlar yapın)/başlatma vb) yerine, mayo için örneğini oluşturmak sahip, bu tür benzer bir ResourceConfig kullanabilir:

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

Not hattı TheResource resource = new TheResource();. Burada TheResource'un kendi örneğini oluşturuyoruz ve şimdi ilerde manipüle edebiliriz.