簡體   English   中英

播放框架 - 綁定路由中的枚舉

[英]play framework - bind enum in routes

我正在使用java on play 2.2構建一個應用程序。

我有一個java枚舉作為我在路由中使用的函數中的參數。

這是我的enum課程。 我四處搜索,發現我需要實現QueryStringBindable才能在路由中使用它。

public enum Something implements QueryStringBindable<Something> {
    a,
    b,
    c;

    @Override
    public F.Option<ClientStatus> bind(String key, Map<String, String[]> params) {
        String[] arr = params.get(key);
        if (arr == null || arr.length == 0) {
            return F.Option.None();
        } else {
            Something status = Something.valueOf(arr[0]);
            return F.Option.Some(status);
        }
    }

    @Override
    public String unbind(String key) {
        return null;
    }

    @Override
    public String javascriptUnbind() {
        return null;
    }
}

然而我嘗試了我的路線:

GET    /someurl     controllers.Application.function(status: util.enums.Something)

但它返回錯誤消息的錯誤請求:

要求'GET / someurl'[util.enums.Something]

我用谷歌搜索,並沒有找到任何答案在我的情況下工作。 我錯過了什么或玩不支持綁定枚舉?

我有同樣的問題,我終於發現它不能解決。

通過閱讀PathBindableQueryStringBindable的文檔,我發現play框架需要 Bindable提供No Argument公共構造函數。 根據定義,Java中的enum是不可能的。

所以我不得不用我的枚舉來解決這個問題。 在你的例子中我們會有類似的東西:

public enum Something {
    a,
    b,
    c;

    public static class Bound implements QueryStringBindable<Bound>{
       private Something value;

        @Override
        public F.Option<ClientStatus> bind(String key, Map<String, String[]> params) {
            String[] arr = params.get(key);
            if (arr != null && arr.lenght > 0) {
                this.value = Something.valueOf(arr[0]);
                return F.Option.Some(this);
            } else {
                return F.Option.None();
            }
        }

        @Override
        public String unbind(String key) {
            return this.value.name();
        }

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

       public Something value(){
           return this.value;
       }
    }
}

然后你必須使用some.package.Something.Bound類型作為路由文件中的類型。

編輯:在模板中使用它稍微有點棘手。 你必須知道一點scala。 關注@Aleksei的評論

<a href="@routes.MyController.showStuff(myEnumVar)">link</a>

應該成為

<a href="@{
   routes.MyController.showStuff(new MyEnumVarWrapper(myEnumVar)).url
}">link</a>

我想對答案提供一個小的修正:(返回類型不是ClientStatus,unbind函數應該使用key參數,它是url generatiion)

public enum Something {
a,
b,
c;

public static class Bound implements QueryStringBindable<Bound>{
   private Something value;

    @Override
    public F.Option<Bound> bind(String key, Map<String, String[]> params) {
        String[] arr = params.get(key);
        if (arr != null && arr.lenght > 0) {
            this.value = Something.valueOf(arr[0]);
            return F.Option.Some(this);
        } else {
            return F.Option.None();
        }
    }

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

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

   public Something value(){
       return this.value;
   }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM