2012-05-02 21 views
5

Jak ustawić metodę przeciążania w aplikacji Application.java w programie Play Project?Metoda przeciążania w aplikacji Application.java Play Framework

Oto przykład, co mam aktualnie robi:

Application.java

public class Application extends Controller { 

    public static void index() { 
     render(); 
    } 

    public static void getData() { 
     renderText("Without Parameter"); 
    } 

    public static void getData(String name) { 
     renderText("With Parameter name = " + name); 
    } 
} 

trasy

# Routes 
# This file defines all application routes (Higher priority routes first) 
# ~~~~ 

# Home page 
GET /          Application.index 
GET  /data         Application.getData 

# Ignore favicon requests 
GET  /favicon.ico       404 

# Map static resources from the /app/public folder to the /public path 
GET  /public/        staticDir:public 

# Catch all 
*  /{controller}/{action}     {controller}.{action} 

Test:

  1. połączeń getData bez parametru http://localhost:9000/data
  2. połączeń getData parametrem http://localhost:9000/data?name=test

Rezultat:

  1. Z Nazwa parametru = null
  2. Z Nazwa parametru = test

co chcę dla wyniku:

  1. bez podania
  2. z nazwą parametru = testu

Jestem bardzo cenione z Twojego pomaga. Dziękuję ...


Aktualizacja Rozwiązanie

Oto, co robię na podstawie Daniel Alexiuc sugestia:

Application.java

public class Application extends Controller { 

    public static void index() { 
     render(); 
    } 

    public static void getData() { 
     /** 
     * Do some process before call getDataName method 
     * and send the result of the process as the parameter. 
     * That's why I do this way that look like redundancy process. 
     **/ 
     getDataName(null); 
    } 

    public static void getDataName(String name) { 
     // Didn't use ternary operation here because will become error 'not a statement' 
     if(name == null) 
      renderText("Without Parameter"); 
     else 
      renderText("With Parameter name = " + name); 
    } 

} 

tras

GET /          Application.index 
GET  /default        Application.getData 
GET  /dataString        Application.getDataName 

Aktualizacja Rozwiązanie (26/07)

Application.java

public class Application extends Controller { 

    public static void index() { 
     render(); 
    } 

    public static void getData(String name, Integer age) { 
     if (name == null && age == null) { 
      renderText("Data null"); 
     } else if (name != null && age == null) { 
      renderText("Name: " + name); 
     } else if (name != null && age != null) { 
      renderText("Name: " + name + "\n" + "Age: " + age); 
     } 
    } 
} 

trasy

GET  /data         Application.getData 
GET  /data/{name}       Application.getData 
GET  /data/{name}/{age}      Application.getData 

I dla wywołania:

1. http://localhost:9000/data    -> Display "Data null" 
2. http://localhost:9000/data/Crazenezz  -> Display "Name: Crazenezz" 
3. http://localhost:9000/data/Crazenezz/24 -> Display "Name: Crazenezz 
                  Age: 24" 

Odpowiedz

2

Nie sądzę, że jest możliwe, aby przeciążać go w pliku trasy tak, jak chcesz.

ale można po prostu zrobić coś takiego:

public static void getData(String name) { 
    if (name == null) { 
    renderText("Without Parameter"); 
    } else { 
    renderText("With Parameter name = " + name); 
    } 
} 
+0

Dziękuję za odpowiedź, pozwól zobaczyć, co inny ekspert mówi o tym problemie, czy to możliwe, czy nie. – Crazenezz

+0

Próbowałem na wiele sposobów i nie znalazłem innego możliwego. Więc zdecydowałem się na twój styl :-) – Crazenezz

1

wierzę chciałem osiągnąć to samo co ty, Crazenezz, więc najpierw próbowałem z poniższej definicji trasy:

GET  /terms.json     controllers.exposedjson.TermServiceJSON.findTermsByQuery(langId:Long ?= null) 

... wraz z metodą w kontrolerze, która sprawdziła, czy argument był zerowy, czy nie, ale to się nie powiodło, ponieważ null nie było ważną wartością opcjonalną w definicji trasy. Zamiast tego wierzę, że pójdę z następującym rozwiązaniem (które działa do tej pory), odsłaniając wartość ciągu w interfejsie usługi JSON, który odłożyłem na długi w kontrolerze.

To nie jest bardzo ładne, ale z perspektywy klienta usług może być lepsze niż używanie dwóch oddzielnych ścieżek.

+0

Po tym, jak wypróbowałem twoją sugestię za pomocą 3 metody przeciążania, odkryłem, że parametr 'langId: Long? = Null' nie był zbyt użyteczny. To przypuszczalnie było napisane w ten sposób: 'langId: '5'', to była wartość statyczna i jeśli użytkownik zażąda'/terms.json' bez parametru, przekaże '5' jako wartość domyślną. Możesz sprawdzić wiersz polecenia lub terminal, czy 'langId: Long? = Null jest ignorowany' jeśli nadal używasz powyższej konfiguracji. Po pierwsze myślę, że to jest to, czego chcę, ale po testach znowu i znowu przychodzę z innym rozwiązaniem, zapoznaj się z powyższym rozwiązaniem do aktualizacji. Przyjemnie spróbuj ... :) – Crazenezz