2015-05-21 18 views
6

Próbuję uruchomić zarówno HTTPServer, jak i REST Handler. Tylko jeden działa jednocześnie, nie jest w stanie działać jednocześnie. Muszę obsługiwać strony html, a także api.Uruchamianie HTTP i Resteasy przy pomocy prądu i odpoczynku

Oto mój kod.

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

Jestem stoi ta sama kwestia. Czy wymyśliłeś obejście? – yyff

Odpowiedz

4

The UndertowJaxrsServer jest przesłanianie filehandler swojego konstruktora:

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

Wydaje się, nie ma sposobu, aby przejść kolejną obsługi do UndertowJaxrsServer. Możliwe rozwiązania alternatywne to:

  • Wdróż kolejną aplikację z jedną klasą zasobów, która po prostu wyświetla pliki.
  • Użyj pustego Undertow i stracisz wygodę łatwych wdrożeń JAX-RS.
+0

Witam, mam do czynienia z tym samym problemem. Jak mogę "użyć pustego Undertow i stracić wygodę łatwych wdrożeń JAX-RS"? – yyff

+0

Aby uzyskać pierwsze obejście problemu: "Wdróż inną aplikację z jedną klasą zasobów, która po prostu wyświetla pliki.", Jak by to działało? Jeśli uruchomisz dwie aplikacje, będą słuchać różnych numerów portów, prawda? – yyff

0

od wersji 3.1.0.Beta2 i wyższym można spróbować to

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 aplikacja będzie dostępna w/API/* i plików statycznych w/*

Powiązane problemy