Tou*_*uko 9 java parameters double routes playframework-2.0
我正在学习自己玩2.0(使用的Java API),并希望有一个双/浮点参数(位置坐标),像http://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253.
我可以通过将参数作为String并在控制器等处解析它来做到这一点,但我可以在这里使用自动绑定吗?
现在,我首先尝试简单地使用一个double值:
GET /events/foo controllers.Application.foo(doublevalue: Double)
Run Code Online (Sandbox Code Playgroud)
同
public static Result foo(Double doublevalue) {
return ok(index.render("Foo:" + doublevalue));
}
Run Code Online (Sandbox Code Playgroud)
我得到的是"找不到类型为Double的QueryString绑定器.尝试为此类型实现隐式QueryStringBindable."
我是否遗漏了已经提供的内容,或者我是否需要创建一个解析Double的自定义QueryStringBindable?
我发现在做Scala的自定义字符串查询字符串粘结剂一些指令http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play -2 /
我在包装粘合剂上实现了DoubleBinder:
import java.util.Map;
import play.libs.F.Option;
import play.mvc.QueryStringBindable;
public class DoubleBinder implements QueryStringBindable<Double>{
@Override
public Option<Double> bind(String key, Map<String, String[]> data) {
String[] value = data.get(key);
if(value == null || value.length == 0) {
return Option.None();
} else {
return Option.Some(Double.parseDouble(value[0]));
}
}
@Override
public String javascriptUnbind() {
// TODO Auto-generated method stub
return null;
}
@Override
public String unbind(String key) {
// TODO Auto-generated method stub
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
并尝试将其添加到project/Build.scala的main:
routesImport += "binders._"
Run Code Online (Sandbox Code Playgroud)
但结果相同:"找不到类型为Double的QueryString绑定器...."
Jul*_*Foy 12
目前(在Play 2.0中),Java绑定器仅适用于自递归类型.也就是说,类似如下的类型:
class Foo extends QueryStringBindable<Foo> {
…
}
Run Code Online (Sandbox Code Playgroud)
因此,如果要为java.lang.Double现有类型的Java 定义绑定器,则需要将其包装为自递归类型.例如:
package util;
public class DoubleW implements QueryStringBindable<DoubleW> {
public Double value = null;
@Override
public Option<DoubleW> bind(String key, Map<String, String[]> data) {
String[] vs = data.get(key);
if (vs != null && vs.length > 0) {
String v = vs[0];
value = Double.parseDouble(v);
return F.Some(this);
}
return F.None();
}
@Override
public String unbind(String key) {
return key + "=" + value;
}
@Override
public String javascriptUnbind() {
return value.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以在您的应用程序中使用它如下:
GET /foo controllers.Application.action(d: util.DoubleW)
Run Code Online (Sandbox Code Playgroud)
public static Result action(DoubleW d) {
…
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6560 次 |
| 最近记录: |