2015-06-15 1 views
6

Sto provando ad avviare un'applicazione utilizzando Play Framework 2.4 con JDK8 in Mac, quando scarico la base utilizzando ./activator new Project play-java il codice del template contiene i seguenti:Play Framework 2.4 non accetta "public static Result" per i controllori

progetto/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.")); 
    } 

} 

Ma quando sostituisco questa parte:

public static Result index() {... 

aggiungendo "statico" per index()

ottengo questo errore

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

non so perché, perché in tutti gli esempi utilizzati statico per Risultato

+0

Sai cosa 'static'means in un linguaggio OOP?Apparentemente il membro 'index' della classe base (il campo, non il metodo) è un membro di istanza e quindi non può essere accesso staticamente. – Kryptos

+0

@Kryptos: cosa vuoi dire? index() non è accessibile in alcun modo qui, statico o non statico. Il motivo è che Play è passato a metodi di azione non statici dalla versione 2.4. – Kris

+0

@Kris, stai scambiando 'index' per 'index()'. – Kryptos

risposta

10

Probabilmente stai ancora utilizzando eredità stile di routing.

Dal documentation:

iniettato generatore di percorsi Per impostazione predefinita, gioco genererà un router statico, che presuppone che tutte le azioni sono metodi statici. Configurando Play per utilizzare il generatore di rotte iniettate, è possibile avviare Play per generare un router che dichiarerà tutti i controller verso cui è indirizzato come dipendenze, consentendo ai controller di essere autoprocessati.

Si consiglia di utilizzare sempre il generatore di rotte iniettate, il generatore di route statiche esiste principalmente come strumento per agevolare la migrazione in modo che i progetti esistenti non debbano rendere tutti i loro controller non statici contemporaneamente.

Per attivare il generatore di percorsi iniettato, aggiungere il seguente alle tue impostazioni di generazione in build.sbt:

routesGenerator: = InjectedRoutesGenerator

In alternativa, si può attaccare con il router statico (ma se si 're la creazione di una nuova applicazione, perché dovresti?) e prefisso il riferimento azione con un @

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

Nel mio codice il metodo di indice nel controller è non statico ancora la mia applicazione sta funzionando. Come i metodi non statici possono essere chiamati dal nome della classe. –

+0

Ciò che scrivi nel file 'routes' non è un'invocazione di un metodo. 'routes' è in realtà un DSL Scala ed è compilato. Quando richiesto, il metodo named verrà invocato su un'istanza della classe denominata. –

+0

http://stackoverflow.com/questions/41918001/java-play-application-running-disite-of-having-errors-how-to-resolve-this-erro/41921400?noredirect=1#comment71039546_41921400 puoi rispondi a questa domanda? –

1

Gioca 2.4 ha cambiato il generatore di percorsi predefiniti per InjectedRoutesGenerator a utilizzare Iniezione delle dipendenze per le rotte. Almeno tjhat è ciò che è impostato nel modello play-java. Se si desidera utilizzare ancora il modo statico commentare la seguente riga nel file 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 

Vedi https://www.playframework.com/documentation/2.4.x/Migration24 guida> Dependency Injection> Routing per i dettagli