玩!框架 - 将Map传递给同一控制器中的另一个公共静态方法

时间:2012-02-24 18:52:10

标签: java playframework

外部路由在控制器中命中此方法:

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");

}

我可以传递字符串或布尔值。我做错了什么?

4 个答案:

答案 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()确切返回了哪种类型,也许它需要一些特殊的地图实现。