2015-05-21 14 views
6

Sto tentando di eseguire sia HTTPServer che il gestore REST. Solo uno alla volta non è in grado di farlo funzionare contemporaneamente. Devo servire pagine HTML e anche l'API.Gestore HTTP e Resteasy Deployment con undertow e resteasy

ecco il mio codice.

public class HttpServer { 

    private final UndertowJaxrsServer server = new UndertowJaxrsServer(); 
    private static String rootPath = System.getProperty("user.dir"); 

    private final Undertow.Builder serverBuilder; 

    public HttpServer(Integer port, String host) { 
     serverBuilder = Undertow 
       .builder() 
       .addHttpListener(port, host) 
       .setHandler(
         Handlers.path().addPrefixPath(
           "/", 
           Handlers.resource(
             new FileResourceManager(new File(
               rootPath + "/web"), 100)) 
             .addWelcomeFiles(
               rootPath + "/web/index.html"))); 
     server.start(serverBuilder); 
    } 

    public DeploymentInfo deployApplication(String appPath, 
      Class<? extends Application> applicationClass) { 
     ResteasyDeployment deployment = new ResteasyDeployment(); 
     deployment.setApplicationClass(applicationClass.getName()); 
     return server.undertowDeployment(deployment, appPath); 
    } 

    public void deploy(DeploymentInfo deploymentInfo) throws ServletException { 
     server.deploy(deploymentInfo); 
    } 

    public static void main(String[] args) throws ServletException { 
     HttpServer myServer = new HttpServer(8080, "0.0.0.0"); 

     DeploymentInfo di = myServer 
       .deployApplication("/rest", MyApplication.class) 
       .setClassLoader(HttpServer.class.getClassLoader()) 
       .setContextPath("/my").setDeploymentName("My Application"); 
     myServer.deploy(di); 
    } 
} 
+0

sto affrontando lo stesso problema. Hai trovato una soluzione? – yyff

risposta

4

Il UndertowJaxrsServer è prevalente l'filehandler del vostro costruttore:

public UndertowJaxrsServer start(Undertow.Builder builder) 
{ 
    server = builder.setHandler(root).build(); 
    server.start(); 
    return this; 
} 

Sembra che ci sia alcun modo per passare un altro gestore al UndertowJaxrsServer. Possibili soluzioni alternative potrebbero essere:

  • Distribuire un'altra applicazione con una classe di risorsa che serve semplicemente i file.
  • Utilizzare la risacca vuota e perdere il comfort di facili distribuzioni JAX-RS.
+0

Ciao, sto affrontando lo stesso problema. Come potrei "Usare Undertow vuoto e perdere il comfort di facili distribuzioni JAX-RS"? – yyff

+0

Per prima soluzione alternativa "Distribuisci un'altra applicazione con una classe di risorse che serve semplicemente i file.", Come funzionerebbe? Se esegui due applicazioni, ascolteranno numeri di porta diversi, giusto? – yyff

0

Dalla versione 3.1.0.Beta2 e più alto si può provare questo

UndertowJaxrsServer server = new UndertowJaxrsServer(); 

ResteasyDeployment deployment = new ResteasyDeployment(); 

deployment.setApplicationClass(ExampleApplication.class.getName()); 

DeploymentInfo deploymentInfo = server.undertowDeployment(deployment, "/"); 
deploymentInfo.setClassLoader(MyServer.class.getClassLoader()); 

deploymentInfo.setContextPath("/api"); 

server.deploy(deploymentInfo); 

server.addResourcePrefixPath("/", 
     resource(new PathResourceManager(Paths.get(STATIC_PATH),100)). 
      addWelcomeFiles("index.html")); 

server.start(); 

RESTEasy applicazione sarà disponibile a/API/* file statici e a/*