外部路由在控制器中命中此方法:
public static void externalRouteHit() {
Map<String, String> myParams = request.params.allSimple();
redirectedRoute(myParams);
}
然后,我尝试将Map传递给同一控制器中的另一个方法,但它为null。
public static void redirectedRoute(Map<String, String> myParams) {
if (myParams == null)
Logger.info("WTF");
}
我可以传递字符串或布尔值。我做错了什么?
答案 0 :(得分:2)
如果你想从你的一个控制器调用另一个公共静态void方法而没有游戏创建重定向,你将不得不使用@Util
来注释该方法示例:
public class MyController extends Controller {
public static void index(){
Map xyz = ....;
helperMethod(xyz);
}
@Util
public static void helperMethod(Map map){
/// do stuff
}
}
答案 1 :(得分:1)
根据http://www.playframework.org/documentation/1.2.4/controllers,当Play操作处理Map参数时,它需要查询参数的特定格式:
Play还处理绑定Map的特殊情况 像这样:
public static void show(Map client){ ... }
如下所示的查询字符串:
?client.name =约翰&安培; client.phone = 111-1111&安培; client.phone = 222-2222
将客户端变量绑定到具有两个元素的地图。 第一个元素的键名和值为John,第二个元素 使用按键电话和值111-1111,222-2222。
换句话说,您必须使用特殊格式的命名查询参数。您想要的是传递所有查询参数。
这是一个有效的例子。它似乎很冗长,但它确实有效。尝试点击/ application / externalRouteHit?color = red&amp; size = XS。
public class Application extends Controller {
public static void externalRouteHit() {
Map<String, Object> myParams = new HashMap<String, Object>();
for (String key : params.allSimple().keySet()) {
if (!key.equals("body")) {
myParams.put(key, params.allSimple().get(key));
}
}
redirect(Router.reverse("Application.redirectedRoute", myParams).url);
}
public static void redirectedRoute() {
renderText("color = " + params.get("color") + ", size = " + params.get("size"));
}
}
答案 2 :(得分:0)
这是因为重定向是真正的HTTP重定向(302),因此将从URL生成到动作名称的HTTP请求,并且将尝试将地图转换为URL的一部分。
我想从地图转换到地图失败
答案 3 :(得分:0)
如果你想通过重定向传递请求参数,你可能只想使用:params.flash(),它会将所有参数存储在cookie中,它们将通过“flash”变量在被调用的控制器(和模板)中可用
从地图开始,它应该有效,http://www.playframework.org/documentation/1.2.4/controllers处的文档具体说明:
Play还处理绑定Map的特殊情况 像这样:
public static void show(Map client){ ......}
你可能想要检查request.params.allSimple()确切返回了哪种类型,也许它需要一些特殊的地图实现。