2012-06-14 21 views
5

Mam zdefiniowany typ wyliczeniowy Format, który implementuje QueryStringBindable. Wydaje mi się, że zaimplementowałem go poprawnie, ale w moim pliku tras nie mogę określić mojego typu jako parametru trasy, ponieważ kompilator nie może go znaleźć i nie mam pojęcia, jak zaimportować go do pliku tras.QueryStringBindable dla niestandardowego wyliczenia

Oto wyliczenia:

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(); 
    } 
} 

A oto moja trasa:

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

Jak mogę poinformować kompilator o moim enum? Dzięki!

Edit

Próbowałem zostały również dodanie ścieżki do typu w Build.scala jak zostało to zalecane w innych stanowisk:

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) 
) 

Zmieniłem to i ponownym uruchomieniu mojego serwera, ale wydaje się, że nie robi żadnej różnicy.

Odpowiedz

0

Zastosowanie kwalifikowana nazwa w pliku trasy, tj web.Format

+1

Wypróbowałem to przed wysłaniem. Nie ma kości. – Samo

4

miałem ten sam problem, a ja w końcu okazało się, że nie jest rozwiązywalne, jak jest.

Czytając dokumentację PathBindable i QueryStringBindable Okazało się, że ramy zabaw wymaga z Bindable zapewnić żaden argument konstruktora publicznego. Które z definicji nie jest możliwe z enum w Javie.

Chciałbym zaoferować ci to samo rozwiązanie, które dałem innym (nowszym) pytaniem. Właśnie opakowałem enum w małą klasę Wrapper, która implementuje QueryStringBindable lub PathBindable.

play framework - bind enum in routes

Powiązane problemy