Play framework - bind enumeration in routes

I am creating an application in java to play 2.2.

I have a java enumeration as a parameter in a function that I use in routes.

This is my enum class. I searched and found that I needed to implement a QueryStringBindable in order to use it in routes.

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

However, I tried on my routes:

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

But it returns an invalid request with an error message like:

For the request "GET / someurl" [util.enums.Something]

I searched googled and did not find an answer in my case. Did I miss or play something, doesn’t support list bindings?

+5
source share
2 answers

I had the same problem and I finally found out that it is not solvable as it is.

PathBindable QueryStringBindable, , Bindable No Argument. enum 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 .

EDIT: . scala. @Aleksei

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

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

: ( ClientStatus, unbind , url)

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

}

0

All Articles