2015-05-21 14 views
6

Tôi đang cố gắng chạy cả HTTPServer và cả REST Handler. Chỉ có một công trình tại một thời điểm không thể làm cho nó hoạt động cả hai cùng một lúc. Tôi cần phải phục vụ các trang html và cũng là api.Trình xử lý HTTP và triển khai Resteasy với cam kết và an ủi

đây là mã của tôi.

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

Tôi đang phải đối mặt với cùng một vấn đề. Bạn đã tìm ra cách giải quyết chưa? – yyff

Trả lời

4

Các UndertowJaxrsServer được trọng các filehandler của người xây dựng của bạn:

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

Có vẻ như không có cách nào để vượt qua xử lý khác với UndertowJaxrsServer. Giải pháp có thể có thể là:

  • Triển khai ứng dụng khác với một lớp tài nguyên chỉ đơn giản là phân phát tệp.
  • Sử dụng tính năng Hoàn tác trống và làm mất sự thoải mái của việc triển khai JAX-RS dễ dàng.
+0

Xin chào, tôi đang đối mặt với cùng một vấn đề. Làm thế nào tôi có thể "Sử dụng trống Undertow và mất sự thoải mái của triển khai JAX-RS dễ dàng"? – yyff

+0

Để giải quyết vấn đề đầu tiên "Triển khai một ứng dụng khác với một lớp tài nguyên chỉ đơn giản là phục vụ các tệp.", Cách này hoạt động như thế nào? Nếu chạy hai ứng dụng, chúng sẽ nghe các số cổng khác nhau, đúng không? – yyff

0

Từ phiên bản 3.1.0.Beta2 và cao hơn bạn có thể thử

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

ứng dụng RestEasy này sẽ có mặt tại/api/* và các tập tin tĩnh tại/*

Các vấn đề liên quan