2012-05-09 5 views
3

В Play при перегрузке методов контроллера эти отдельные методы не могут быть маршрутизированы более одного раза, потому что компилятор ему не нравится.Маршрутизация перегруженных функций в Play Framework 2.0

Есть ли способ обойти это?

Скажите, были ли у меня две функции в контроллере Product: getBy(String name) и getBy(long id).

И у меня было два разных пути для этих функций, объявленных в routes:

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

Я хочу использовать «же» функции для различных маршрутов, возможно ли это?

ответ

3

Нет, это невозможно, есть два решения.

Первый является использовать 2 названия:

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) 

использует один метод со строковым аргументом и проверить внутренне, если он может быть преобразован в Long

public static Result getByArgOfAnyType(String arg) { 
    try { 
     Long.parseLong(arg); 
     return ok("Long: " + arg); 
    } catch (Exception e) { 
     return ok("String: " + arg); 
    } 
} 

маршрут:

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

Я знаю, что не подходит ваш вопрос, но по крайней мере сэкономит ваше время. Также имейте в виду, что могут быть лучшие способы определить, можно ли преобразовать String в числовой тип, то есть в этом вопросе: What's the best way to check to see if a String represents an integer in Java?

+0

Второе решение для меня достаточно близко. Благодарю. – snnth

+1

Почему это запрещено? – user2601010

Смежные вопросы