Jmeter beanshell不支持Map<String, String>泛型 解决方法(原创)
一、什么是Bean Shell
- BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
- BeanShell是一种松散类型的脚本语言(这点和JS类似);
- BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
beanshell官方文档 http://www.beanshell.org/manual/bshmanual.pdf
二、beanshell不支持泛型
什么是泛型
http://blog.csdn.net/s10461/article/details/53941091
泛型方法
你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
下面是定义泛型方法的规则:
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的<E>)。
- 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
- 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
三、解决方法
1)改类型
1 import com.xindun.server.util.Generator; 2 import java.util.HashMap; 3 import java.util.Map; 4 import net.sf.json.JSONObject; 5 6 Generator gen = new Generator(); 7 String version = "01"; 8 String randomUuid = "${__UUID}"; 9 String APP_ID = "com.example.demo"; 10 String DEVICE_INFO = "{\"os_type\":\"android\", \"fpid\":\"12345678\", \"devid\":\"SALKJdFKJSALKFJLKSA2364723984\", \"version\":\"2\"}"; 11 12 StringBuffer result = new StringBuffer(); 13 result.append(gen.GetMD5(APP_ID)); 14 result.append(randomUuid); 15 result.append(version); 16 17 Map params = new HashMap(); 18 // Map<String, Object> params = new HashMap<String, Object>(); 19 params.put("app_id", APP_ID); 20 params.put("user_id", "zhangsan"); 21 params.put("fpid", ""); 22 params.put("phone", "15810047878"); 23 // vars.put("paa",parmas.get("app_id")); 24 // SampleResult.setResponseData(vars.get("paa")); 25 System.out.println("aaa----------" + params); 26 String cookie = randomUuid + JSONObject.fromObject(params).toString() + ";;" + gen.getZipString(DEVICE_INFO); 27 String INIT_KEY = "OcUx0DhJrRTVUQJSL1mMbX4Ab78ROULkf052bcYbhImsa2jUZj7rl5wvS/9nZW/v" 28 byte[] rootkey_b = gen.decryptKeyForSave(INIT_KEY); 29 byte[] workkey = gen.getWorkKey(rootkey_b, randomUuid);
如上代码第17非泛型写法,18行就是泛型。
Map params = new HashMap(); //未指定类型。这种就不是泛型,可以用这个。
Map<String, Object> params = new HashMap<String, Object>(); //用<>指定类型为泛型。这种在jmeter里报错。

2)把需要泛型部分的代码,打包成jar
将jar放到lib/ext目录,然后在beanshell中调用对应的接口解决这个问题,beanshell 不支持java 1.5以上的语法
3)直接将这个参数拼成字符串,当然我这个可以适用
{"app_id":\"" + APP_ID + "\",\"user_id":"zhangsan","fpid":"a444","phone":"15810047878"}

浙公网安备 33010602011771号