2013-08-21 18 views
5

Tôi muốn biết làm thế nào có thể retrive một đối tượng route từ một chuỗi trong lớp global.java vì im đang cố gắng tạo một module định tuyến động: tôi không muốn để chỉnh sửa tuyến đường chính của tôi mỗi lần tôi thêm một mô-đun (tiểu dự án) nhưjava play framework 2.1.3 Làm thế nào để retrive một đối tượng route

- mymodule.Routes>/mymodule

vì vậy, để tránh điều này, tôi Tring để tải các tuyến đường mục tiêu phụ thuộc vào các Đường dẫn URI. /module/mymodule

Tôi tryed để viết một số mã như sau bên onRouteRequest()

Class.forName("mymodule.Routes").routes.lift(request); 

nhưng nó thất bại, bất cứ đề nghị?

chỉnh sửa 1: chơi 1 trong là có thể một cái gì đó như thế:

/{controller}/{action} {controller}.{action} 

Nhưng trong play2 dường như không làm việc cũng

chỉnh sửa 2: Global.java hiện tại của tôi là

import play.GlobalSettings; 
import play.Play; 
import play.api.mvc.Handler; 
import play.mvc.Http; 

public class Global extends GlobalSettings 
{ 

@Override 
public Handler onRouteRequest(Http.RequestHeader request) 
{ 
    String path = request.path(); 
    if (path.startsWith("/module/")) 
    { 
     String[] paths = path.split("/"); 
     String router = paths[2]; 
     try 
     { 
      return (Handler) Class.forName(router + ".Routes", true, Play.application().classloader()).newInstance(); 
     } 
     catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    return super.onRouteRequest(request); 
} 
} 

Và anh ấy tìm thấy các tuyến đường chính xác nhưng Ngoại lệ tức thì bị ném

+0

Gọi 'newInstance()' có vẻ không thành công ở đây. Bộ định tuyến của bạn có hàm tạo công khai không tham số không? – Kapep

+1

Vấn đề là những gì @kapep đã đề cập. Lớp 'Routes' không có hàm tạo mặc định. Nó có một loạt các phương thức tĩnh. Có một cái gọi là 'handlerFor' có vẻ đầy hứa hẹn nhưng nó có một đối tượng' play.api.mvc.RequestHeader', không phải là phiên bản Java 'play.mvc.Http.RequestHeader' được truyền vào phương thức' onRouteRequest'. – estmatic

+0

Infact tôi phản ánh tuyến đường theo cách tĩnh nhưng tôi đã tìm thấy những vấn đề này. Vì vậy, các giải pháp thay thế? – user2054758

Trả lời

1

đó là một chút mất tinh thần sự kém cỏi của java đối với scala trong khuôn khổ này. Sau một vài ngày, tôi quyết định thực hiện xử lý tự động bằng văn bản các nội dung mới trong các tập tin tuyến đường chính mỗi khi máy chủ được khởi động.

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

import play.Application; 
import play.GlobalSettings; 

public class Global extends GlobalSettings 
{ 
@Override 
public void onStart(Application app) 
{ 
    String newline = System.getProperty("line.separator"); 
    File route = app.getFile("/conf/routes"); 
    File[] modules = app.getFile("/modules").listFiles(); 

    String newContents = "# start of autogenerated code" + newline; 
    for (File module : modules) 
    { 
     String moduleLow = module.getName().toLowerCase(); 
     newContents += "-> /module " + moduleLow + ".Routes " + newline; 
    } 
    newContents += "# end of autogenerated code" + newline; 
    editRoute(route, newContents, newline); 

} 

private void editRoute(File route, String newContents, String newline) 
{ 
    try 
    { 
     FileReader f = new FileReader(route); 
     BufferedReader br = new BufferedReader(f); 
     String contents = ""; 
     while (true) 
     { 
      String s = br.readLine(); 
      if (s == null) 
       break; 
      contents += s + newline; 
     } 
     br.close(); 

     FileWriter w = new FileWriter(route); 
     BufferedWriter b = new BufferedWriter(w); 
     b.write(newContents + contents); 
     b.flush(); 
     b.close(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onStop(Application app) 
{ 
    String newline = System.getProperty("line.separator"); 
    File route = app.getFile("/conf/routes"); 
    try 
    { 
     FileReader f = new FileReader(route); 
     BufferedReader br = new BufferedReader(f); 
     String contents = ""; 
     boolean startAutoCode = false; 
     boolean endAutoCode = false; 
     while (true) 
     { 
      String s = br.readLine(); 
      if (s == null) 
       break; 
      if (s.contains("# start of autogenerated code")) 
      { 
       startAutoCode = true; 
      } 
      else if (s.contains("# end of autogenerated code")) 
      { 
       endAutoCode = true; 
       continue; 
      } 

      if (!startAutoCode || endAutoCode) 
      { 
       contents += s + newline; 
      } 
     } 
     br.close(); 

     FileWriter w = new FileWriter(route); 
     BufferedWriter b = new BufferedWriter(w); 
     b.write(contents); 
     b.flush(); 
     b.close(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 
Các vấn đề liên quan