2013-08-21 10 views
5

Chciałbym wiedzieć, jak można pobrać obiekt trasy z łańcucha w klasie global.java, ponieważ próbuję utworzyć dynamiczny routing modułów: nie chcę edytować moje główne szlaki każdym razem dodaję moduł (sub-projektu) jakojava play framework 2.1.3 Jak odświeżyć obiekt tras

->/mymodule mymodule.Routes

więc aby tego uniknąć, jestem tring załadowanie trasy docelowe zależnie od Ścieżka URI. /moduł/mymodule

tryed napisać trochę kodu następująco wewnątrz onRouteRequest()

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

ale to się nie uda, jakieś sugestie?

edit 1: 1 w grze można było coś takiego:

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

Ale w PLAY2 wydaje się nie pracy, jak również

edit 2: moja obecna Global.java jest

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

Znalazł poprawne trasy, ale wyrzucono wyjątek natychmiastowy

+0

Wywołanie 'newInstance()' wydaje się tutaj nieudane. Czy twój router ma publiczny konstruktor bez parametrów? – Kapep

+1

Problem polega na tym, o czym wspomniał @kapep. Klasa 'Routes' nie ma domyślnego konstruktora. Ma szereg statycznych metod. Jest jeden zwany 'handlerFor', który wydaje się obiecujący, ale wymaga obiektu' play.api.mvc.RequestHeader', a nie wersji Java 'play.mvc.Http.RequestHeader', która jest przekazywana do metody' onRouteRequest'. – estmatic

+0

infact i odzwierciedlone Trasy w sposób statyczny, ale znalazłem te problemy. A więc alternatywne rozwiązania? – user2054758

Odpowiedz

1

To trochę demoralizuje jaśniejszą niższość wobec scala w tych ramach. Po kilku dniach postanowiłem wykonać automatyczną obsługę zapisywania nowej zawartości w głównym pliku tras przy każdym uruchomieniu serwera.

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