2012-06-14 51 views
5

我已经定义了一个实现QueryStringBindable的枚举类型Format。我想我已经正确实现了它,但是在我的路由文件中,我无法将我的类型指定为路由参数,因为编译器找不到它,并且我不知道如何将它导入路由文件。对于自定义枚举的QueryStringBindable

这里的枚举:

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

这是我的路线:

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

我怎么能告诉我枚举的编译器?谢谢!

编辑

我也试着为已在其他帖子被推荐加入的路径,在Build.scala类型:

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

我改变了这一切,并重新启动我的服务器,但它似乎没有任何区别。

回答

0

使用合格的名称在routes文件,即web.Format

+1

在发布前尝试过。没有骰子。 – Samo

4

我有同样的问题,我终于找到了它不是可解为是。

通过阅读文档PathBindableQueryStringBindable我发现,游戏框架需要可绑定提供无参数公共构造函数。根据定义,在Java中使用enum是不可能的。

我想为您提供同样的解决方案,我给了另一个(更近的)问题。 我只是将enum包装成一个小的Wrapper类,它实现了QueryStringBindablePathBindable

play framework - bind enum in routes