当前位置: 首页 > 面试题库 >

如何将Double参数与Play 2.0路由绑定

满博
2023-03-14
问题内容

我正在学习Play 2.0(使用Java API)并希望使用double /
float参数(用于位置坐标),例如http://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253。

我可以通过将参数获取为String并在控制器等处进行解析来做到这一点,但是我可以在这里使用自动绑定吗?

现在,我首先尝试仅具有一个double值:

GET     /events/foo                 controllers.Application.foo(doublevalue: Double)

public static Result foo(Double doublevalue) {
    return ok(index.render("Foo:" + doublevalue));
}

我得到的是 “找不到Double类型的QueryString绑定器。请尝试为此类型实现隐式QueryStringBindable。”

我错过了已经提供的东西吗?还是必须制作一个可解析Double的自定义QueryStringBindable?

我在http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-
pathbindable-with-play中
找到了一些有关使用Scala创建自定义字符串查询字符串绑定器的说明-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;
    }
}

并尝试将其添加到project / Build.scala的main中:

routesImport += "binders._"

但是结果相同:“未找到Double …类型的QueryString绑定器。”

  • 我也将路由签名更改为java.lang.Double,但这也没有帮助
  • 我还更改了DoubleBinder以在路由签名处同时使用Double和java.lang.Double来实现play.api.mvc.QueryStringBindable(而不是play.mvc.QueryStringBindable),但是仍然没有帮助

问题答案:

当前(在Play 2.0中),Java活页夹仅适用于自递归类型。也就是说,类型如下所示:

class Foo extends QueryStringBindable<Foo> {
  …
}

因此,如果要为java.lang.DoubleJava的现有类型定义活页夹,则需要将其包装为自递归类型。例如:

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

}

然后,可以在应用程序中按以下方式使用它:

GET    /foo     controllers.Application.action(d: util.DoubleW)



public static Result action(DoubleW d) {
      …
}


 类似资料:
  • 上一篇文章我们说到路由的正则编译,正则编译的目的就是和请求的 url 来匹配,只有匹配上的路由才是我们真正想要的,此外也会通过正则匹配来获取路由的参数。 路由的匹配 路由进行正则编译后,就要与请求 request 来进行正则匹配,并且进行一些验证,例如 UriValidator、MethodValidator、SchemeValidator、HostValidator。 class RouteCo

  • 例如,在具有分页列表的路由上,网址可能如下所示,表示我们已加载第二个网页: 使用指令和来传递查询参数。例如: 或者,我们可以使用服务通过JS跳转: 读取查询参数 See Official Documentation on Query Parameters

  • ``` 所以,我的问题是--有没有一种干净的方法来结构和重构路由,而不是将它们集中在一个大的路由定义中?我也许可以创建一个参与者(路由器)的层次结构,主路由定义只是将其委托给路由器,随着我们深入参与者层次结构,我们会逐步添加更多的细节。但是否有一两种普遍接受的模式来组织路线呢?

  • 路由参数 路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及行为执行。5.1版本极大改进了路由参数的用法。 路由参数可以在定义路由规则的时候直接传入(批量),不过5.1采用了更加面向对象的方式进行路由参数配置,因此使用方法配置更加清晰。 参数 说明 方法名 method 请求类型检测,支持多个请求类型 method ext URL后缀检测,支持匹配多个后缀 ext deny_ex

  • 将路由链接到参数 显示特定产品详细信息的组件的路由需要该产品ID的路由参数。我们可以使用以下实现: 注意:product-details路由的路径中的 ,它将参数放在路径中。例如,要查看ID为5的产品的产品详细信息页面,必须使用以下URL:localhost:3000/product-details/5 注意,指令传递一个数组,该数组指定路径和路由参数。或者,我们可以使用JS跳转: Product

  • 可以使用路由绑定简化URL或者路由规则的定义,绑定支持如下方式: 绑定到模块/控制器/操作 把当前的URL绑定到模块/控制器/操作,最多支持绑定到操作级别,例如在路由配置文件中添加: // 绑定当前的URL到 index模块 Route::bind('index'); // 绑定当前的URL到 index模块的blog控制器 Route::bind('index/blog'); // 绑定当前的U