2012-06-14 15 views
5

Ho definito un tipo enum Format che implementa QueryStringBindable. Penso di averlo implementato correttamente, ma nel mio file di rotte, non posso specificare il mio tipo come parametro di rotta, perché il compilatore non riesce a trovarlo e non ho idea di come importarlo nel file di rotte.QueryStringBindable per un enum personalizzato

Ecco l'enum:

package web; 

import java.util.Map; 

import play.libs.F; 
import play.mvc.QueryStringBindable; 

public enum Format implements QueryStringBindable<Format> { 
    Html, 
    Pdf, 
    Csv; 

    private Format value; 

    @Override 
    public F.Option<Format> bind(String key, Map<String, String[]> data) { 
     String[] vs = data.get(key); 
     if (vs != null && vs.length > 0) { 
      String v = vs[0]; 
      value = Enum.valueOf(Format.class, v); 
      return F.Option.Some(value); 
     } 
     return F.Option.None(); 
    } 

    @Override 
    public String unbind(String key) { 
     return key + "=" + value; 
    } 

    @Override 
    public String javascriptUnbind() { 
     return value.toString(); 
    } 
} 

Ed ecco il mio percorso:

GET  /deposits         controllers.Deposits.index(selectedAccountKey: Long ?= 0, format: Format ?= Format.Html) 

Come posso dire al compilatore del mio enum? Grazie!

Modifica

Ho anche provato ad aggiungere il percorso tipo in Build.scala come è stato suggerito in altri post:

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    routesImport += "web.Format", 
    resolvers += Resolver.url("My GitHub Play Repository", url("http://www.joergviola.de/releases/"))(Resolver.ivyStylePatterns) 
) 

ho cambiato e riavviato il mio server, ma sembra non fare alcuna differenza.

risposta

0

Usa nome completo nel file percorsi, vale a dire web.Format

+1

provato prima dell'invio. Niente da fare. – Samo

4

Ho avuto lo stesso problema e alla fine ho scoperto che non è risolvibile come è.

Leggendo la documentazione per PathBindable e QueryStringBindable ho scoperto che il gioco quadro richiede il Bindable per fornire un costruttore pubblico Nessun argomento. Quale per definizione non è possibile con enum in Java.

Mi piacerebbe offrirvi la stessa soluzione che ho dato ad un'altra (più recente) domanda. Ho appena inserito l'enum in una piccola classe Wrapper che implementa QueryStringBindable o.

play framework - bind enum in routes