2015-06-15 16 views
6

Próbuję uruchomić aplikację za pomocą Play Framework 2.4 z JDK8 na Macu, gdy pobierzę bazę za pomocą ./activator nowy Project play-java kod szablonu zawiera następujące:Play Framework 2.4 nie akceptuje "public static Result" dla kontrolerów

projektu/app/controlles/Application.java

package controllers; 

import play.*; 
import play.mvc.*; 

import views.html.*; 

public class Application extends Controller { 

    public Result index() { 
     return ok(index.render("Your new application is ready.")); 
    } 

} 

Ale kiedy wymienić tę część:

public static Result index() {... 

dodając "statyczne" do indeksu()

otrzymuję ten błąd

Compilation error 
value index is not a member of controllers.Application 
.../conf/routes:6 
4 # ~~~~ 
5 # Home page 
6 GET /       controllers.Application.index() 

nie wiem dlaczego, ponieważ we wszystkich przykładach używane statyczne dla wyniku

+0

wiesz co 'static'means w języku OOP?Podobno element "index" klasy bazowej (pole, nie metoda) jest członkiem instancji i dlatego nie można uzyskać do niego dostępu statycznie. – Kryptos

+0

@Kryptos: Co chcesz powiedzieć? Funkcja index() nie jest tutaj dostępna w żaden sposób, statycznie lub niestatycznie. Powodem jest to, że Play przełączył się na metody akcji niestacjonarnych od wersji 2.4. – Kris

+0

@ Chris, mylicie 'index' dla' index() '. – Kryptos

Odpowiedz

10

Pewnie nadal używa dziedzictwo stylu routingu.

Z documentation:

odlewania generator tras Domyślnie, Play wygeneruje statyczny ruter, który zakłada, że ​​wszystkie działania są metody statyczne. Konfigurując Play, aby używał generatora tras wtryskowych, możesz pobrać Play, aby wygenerować router, który zadeklaruje wszystkie kontrolery, do których kieruje, jako zależności, pozwalając kontrolerom na samodzielne wstrzykiwanie zależności.

Zalecamy stosowanie zawsze generatora tras wtryskowych, generator tras statycznych istnieje przede wszystkim jako narzędzie wspomagające migrację, dzięki czemu istniejące projekty nie muszą od razu regulować wszystkich swoich kontrolerów.

Aby włączyć wstrzykiwany generator tras, dodać następujące ustawienia budować w build.sbt:

routesGenerator: = InjectedRoutesGenerator

Alternatywnie, można trzymać się z routerem statycznej (ale jeśli „re tworząc nową aplikację, dlaczego prawda?) i poprzedzić odwołanie działań z @

GET  /some/path  @controllers.Application.index() 
+0

W moim kod metoda indeksu w kontrolerze jest niestatyczna, ale moja aplikacja działa. Jak można wywoływać metody niestatyczne z nazwy klasy. –

+0

To, co piszesz w pliku 'routes' nie jest wywołaniem metody. 'routes' to tak naprawdę Scala DSL i jest skompilowany. Jeśli jest to wymagane, nazwana metoda zostanie wywołana na wystąpieniu nazwanej klasy. –

+0

http://stackoverflow.com/questions/41918001/java-play-application-running-despite-having-errors-how-to-resolve-this-erro/41921400?noredirect=1#comment71039546_41921400 Czy możesz Odpowiedz na to pytanie? –

1

Odtwórz 2.4 zmienił generator trasy domyślne do InjectedRoutesGenerator do użyj Injection Dependency dla tras. Przynajmniej to jest to, co jest ustawione w szablonie play-java. Jeśli chcesz nadal używać statycznego sposób wypowiedzieć następującą linię w pliku build.sbt

// Play provides two styles of routers, one expects its actions to be injected, the 
// other, legacy style, accesses its actions statically. 
//routesGenerator := InjectedRoutesGenerator 

Zobacz https://www.playframework.com/documentation/2.4.x/Migration24 Przewodnik> Dependency Injection> Routing szczegóły

Powiązane problemy