2012-05-09 4 views
3

Play에서는 컨트롤러 메서드가 오버로드 될 때 해당 개별 메서드를 두 번 이상 라우팅 할 수 없으므로 컴파일러는이를 원하지 않습니다.Play Framework 2.0에서 오버로드 된 함수 라우팅

이 문제를 해결할 수있는 방법이 있습니까?

Product 컨트롤러에 두 가지 기능이있는 경우 : getBy(String name)getBy(long id)이라고 말하면됩니다. 내가 다른 경로에 대해 "동일한"기능을 사용하려면

GET /p/:id   controllers.Product.getBy(id: Long) 
GET /p/:name   controllers.Product.getBy(name: String) 

이 가능하다 :

은 내가 routes 선언이 기능에 대한 두 개의 서로 다른 경로를했다?

답변

3

아니요, 불가능합니다. 두 가지 해결책이 있습니다.

먼저이 이름을 사용하는이다, 그렇지 않으면 당신은 얻을 것이다, 또한 그것을위한 별도의 경로를 사용해야합니다

public static Result getByLong(Long id) { 
    return ok("Long value: " + id); 
} 

public static Result getByString(String name) { 
    return ok("String value: " + name); 
} 

을 하나를 사용하는 형식이 일치하지

GET /p-by-long/:id   controllers.Monitor.getByLong(id: Long) 
GET /p-by-string/:name  controllers.Monitor.getByString(name: String) 

두 번째 솔루션 문자열 인수를 사용하여 메서드를 내부적으로 검사하여

,210

경로 :

GET /p/:arg  controllers.Monitor.getByArgOfAnyType(arg : String) 

나는 그 질문에 적합하지 않지만 적어도 당신의 시간을 절약 할 수 있습니다 알고 있습니다. 또한 문자열이 숫자 형식으로 변환 될 수 있는지, 즉이 질문에 더 좋은 방법이 있는지를 염두에 두십시오. What's the best way to check to see if a String represents an integer in Java?

+0

두 번째 솔루션은 저에게 충분히 가깝습니다. 감사. – snnth

+1

왜 허용되지 않습니까? – user2601010