有时我在使用Spark-Java时会遇到路由问题。如果我尝试添加多条路由,有时会用获得参数的路由掩盖无参数路由。我与我的一所大学讨论了该问题,并找到了一个(我认为)效果很好的解决方案。假设您有两条路线:
1. /api/people/:id
2. /api/people/query
要确保两条路线均可用,您必须以正确的顺序进行注册。应该是2,然后是1。原因是spark将使用其包围的路由。
我们事先将所有路线收集在这样的集合中:
private final Set<WebServerRoute> handlers = new TreeSet<>((o1, o2) -> {
int method = Integer.compare(o1.getMethod().ordinal(), o2.getMethod().ordinal());
if (method != 0)
return method;
int indexO1 = o1.getUrl().indexOf(':');
int indexO2 = o2.getUrl().indexOf(':');
if (indexO1 == -1 && indexO2 == -1) {//no route parameters. Just compare by route-length
return o2.getUrl().compareTo(o1.getUrl());
} else if (indexO1 == -1) {//o2 route has parameter -> is greater than o1
return -1;
} else if (indexO2 == -1) {//o1 rout has parameter -> is greater than o1
return 1;
} else {//both routes got a parameter. the one with the lower index comes first
if (indexO1 < indexO2) {//o1's parameters comes first -> o1 is bigger
return 1;
} else {
return -1;
}
}
});
如果Route使用不同的http方法,则仅采用该方法的序数。否则,我们将搜索参数索引并相应地对路线进行排序。
索引为更大的路由排在最前面。 这样的第三条路线像: 3. / api / people / test /:id 会在Route-Nr之前结束。 1
我要打扰您的原因是,您脑中出现了一个问题所在?
最好的问候 迈克尔