2012-04-05 7 views
2

Gibt es eine Möglichkeit, einen REST-Service mit spring 3.0 ohne einen Servlet-Container zu erstellen? Weil ich keinen Anwendungsserver verwenden möchte. Ich habe versucht, REST-Dienste mit SimpleHttpInvokerServiceExporter und Spring MVC zu erstellen, aber ich habe einen java.lang.NoClassDefFoundError: javax/servlet/ServletException, weil ich keinen Servlet-Container verwende. Mein Code sieht wie folgt aus:REST-Service mit Spring 3 auf JDK6 HTTP-Server

<beans> 
    ... 
    <bean name="serviceFacadeExporter" 
     class="org.springframework.remoting.httpinvoker.SimpleHttpInvokerServiceExporter"> 
     <property name="service" ref="serviceFacade" /> 
     <property name="serviceInterface" value="facade.ServiceFacade" /> 
    </bean> 
    <bean id="httpServer" 
     class="org.springframework.remoting.support.SimpleHttpServerFactoryBean"> 
      <property name="contexts"> 
       <map> 
        <entry key="/api/" value-ref="serviceFacadeExporter" /> 
       </map> 
      </property> 
      <property name="port" value="8082" /> 
    </bean> 
    ... 
</beans> 

Und der Service sieht wie folgt aus

@Controller 
public class ServiceFacadeImpl implements ServiceFacade { 

    @Override 
    @RequestMapping(value = "/protein/search/{searchString}") 
    public long searchProtein(@PathVariable String searchString) { 
    return 0; 
    } 
} 
+0

Erster REST bedeutet HTTP.So Sie Container Ihre REST-Anforderungen dienen müssen Servlet gefunden werden. – sathis

+0

Ich möchte den Jdk6 Http Server verwenden. Also habe ich http ohne einen Servlet-Container. –

+0

Warum möchten Sie nicht in einem Servlet-Container laufen? –

Antwort

2

Spring MVC in der API-Servlet erfordert

Sie eine einfache Rast-Service erstellen können JSE 6 HTTP Server mit dem folgenden Weg

Sie eine Ressource-Klasse erstellen

@Path("/helloworld") 
public class MyResource { 

    // The Java method will process HTTP GET requests 
    @GET 
    // The Java method will produce content identified by the MIME Media 
    // type "text/plain" 
    @Produces("text/plain") 
    public String getClichedMessage() { 
     // Return some cliched textual content 
     return "Hello World"; 
    } 
} 

Sie erstellen eine Rast Anwendung

public class MyApplication extends javax.ws.rs.core.Application{ 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> s = new HashSet<Class<?>>(); 
     s.add(MyResource.class); 
     return s; 
    } 
} 

Und das ist, wie Sie Ihren Server

HttpServer server = HttpServer.create(new InetSocketAddress(8080), 25); 
HttpContext context = server.createContext("/resources"); 
HttpHandler handler = RuntimeDelegate.getInstance().createEndpoint 
(new MyApplication(), HttpHandler.class); 
context.setHandler(handler); 
server.start(); 

starten, das ist alles. Kein Spring MVC erforderlich.

Für Testzwecke funktioniert das sehr gut, für eine produktive Nutzung mit vielen Anfragen würde ich einen WebContainer wie Jetty oder Tomcat verwenden.

Eine detailliertere Beschreibung, wie ein geruhsame unter Verwendung des Standard JSE 6 Httpserver aufbauen kann RESTFul Webservice mit JAX-RS (deutsch)

+0

danke, dass mir sehr geholfen hat, aber es wäre interessant zu wissen, ob es eine Möglichkeit gibt, dieses Problem mit Feder-Remoting zu lösen. –

+0

Yeah ... Sekunde, die ich auch lieben würde, sehen Sie das aufgelöst mit Frühling und Frühling MVC. –