2013-08-21 1 views
5

동적 모듈 라우팅을 시도하기 때문에 global.java 클래스의 문자열 객체에서 경로 객체를 검색하는 방법을 알고 싶습니다. 내 주요 노선 내가java play framework 2.1.3 경로 객체 검색 방법

로 모듈 (하위 프로젝트)을 추가 할 때마다 편집 ->/인 MyModule의 mymodule.Routes

을 따라서이를 방지하기 위해, 내가 대상 경로가의 따라로드 트링 해요 URI 경로. /모듈/인 MyModule

나는, 어떤 제안을 onRouteRequest()

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

내부에 따라야하지만 실패로 코드를 작성하는 tryed?

편집 1은 : 1 장을 게임에서 같은 수 있습니다 뭔가이었다

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

을하지만 마찬가지로 play2에서 잘 작동하지 말아 것 같습니다

편집 2 : 내 현재 Global.java이

입니다
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); 
} 
} 

올바른 경로를 찾았지만 인스턴스 예외가 발생했습니다.

+0

'newInstance()'호출은 여기서 실패한 것으로 보입니다. 라우터에 매개 변수없는 공용 생성자가 있습니까? – Kapep

+1

문제는 @kapep이 언급 한 것입니다. 'Routes' 클래스는 기본 생성자를 가지고 있지 않습니다. 정적 메서드가 많습니다. 유망 해 보였던'handlerFor'라는 것이 있지만'onRouteRequest' 메소드로 전달되는 자바 버전'play.mvc.Http.RequestHeader'가 아니라'play.api.mvc.RequestHeader' 객체를 필요로합니다. – estmatic

+0

사실상 정적 인 방법으로 경로를 반영했지만 이러한 문제점을 발견했습니다. 그래서 대체 솔루션? – user2054758

답변

1

이 프레임 워크에서 스칼라에 대한 Java 열등성이 약간 부진합니다. 며칠 후 나는 서버가 시작될 때마다 메인 라우트 파일에 새로운 내용을 쓰는 자동 처리를 수행하기로 결정했다.

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(); 
    } 
} 
} 
관련 문제