6

我已经定义了一个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)
)

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

4

2 回答 2

5

我遇到了同样的问题,我终于发现它无法按原样解决。

通过阅读 for 的文档PathBindableQueryStringBindable我发现 play 框架需要Bindable 提供一个 No Argument 公共构造函数。enum根据定义,这在 Java 中是不可能的。

我想为您提供与另一个(更新的)问题相同的解决方案。我只是将枚举包装到一个小的 Wrapper 类中,该类实现QueryStringBindablePathBindable.

播放框架 - 在路由中绑定枚举

于 2014-02-14T03:29:26.277 回答
0

在路由文件中使用限定名,即 web.Format

于 2012-08-18T01:11:12.337 回答