4

我的搜索控制器中有两种方法

searchBoundingBox - 进行边界框搜索并需要边界框纬度和经度值。搜索 - 进行距离搜索(从中心点进行基于距离的搜索)。

我在路由文件中定义了我的两条路由,如下所示。

#Search
#bounding box
GET     /search                             controllers.Search.searchBoundingBox(swLatitude:java.lang.String,swLongitude:java.lang.String, neLatitude:java.lang.String,neLongitude:java.lang.String)

# distance based
GET     /search                             controllers.Search.search(latitude:java.lang.String,longitude:java.lang.String, offset:java.lang.Integer?=0,distance:java.lang.Integer?=50, limit:java.lang.Integer?=10)

但是当我在第二条路线(基于距离)中创建查询时,它没有得到解决。

任何解决方法!!!(请注意,如果我更改路线的顺序,那么边界框搜索将失败)

4

2 回答 2

5

如果您被迫使用查询参数,您可以对两个搜索使用一个操作作为解决方法:

GET     /search   controllers.Search.search

并自己获取查询参数:

斯卡拉:

def search = Action { request =>
     val latitude = request.queryString.getOrElse("latitude", Seq()).headOption.getOrElse("default")

爪哇:

public static Result search() {
        String latitude = request().queryString().get("latitude")[0];//of course check if param is in map

所以你可以拆分动作:

if(latitude != null)
   searchWithoutBoundingBox()
else
   searchBoundingBox()

您会发现这不是一个很好的类型安全 API,因此最好遵循 Julien 和 biesior 的方法。

于 2012-11-25T08:09:56.817 回答
3

当两条路由使用相同的方法 ( GET) 并且仅首先使用相同的路径 ( /search) 时,这是正常的,此规则没有减损。

Schleichardt给出的第一个解决方案是可能的,但是为了获得最佳安全性,您应该严格控制输入类型。

其次,更快,更容易的解决方案是......只是路径独特的路径,即:

#bounding box
GET     /search/bound/:swLatitude/:swLongitude/:neLatitude/:neLongitude      controllers.Search.searchBoundingBox(swLatitude: String, swLongitude: String, neLatitude: String, neLongitude: String)

# distance based
GET     /search/distance/:latitude/:longitude   controllers.Search.search(latitude: String, longitude: String, offset: Int?=0, distance: Int?=50, limit: Int?=10)

顺便说一句,如果您的 Java 方法使用带有 Scala 的 Integer 类型构造路由,则不需要提供常见类型(如String,等)的完整路径。IntegerInt

于 2012-11-25T09:28:38.760 回答