我将web参数定义为const map = new Map();我把值放在map.set中(metaById [i] .id,metadatoForm [i]);
在Angular端(通过浏览器控制台)我可以看到项正确传递,但在Java端我收到一个奇怪的对象,它没有正确的大小而且是空的(它也是空的键集)
@RequestParam Map<Integer,String> mapQuery) {
...
System.out.println(mapQuery.size()); // always 1 even if hte map has more elements
System.out.println(mapQuery.get(3)); // null
这是我的情况:
在我的Web应用程序中,使用Angular 4编写,我调用Web服务并传递此Web参数
const param = 'map=' + map;
此地图不是真实地图,而是具有此结构的数组:
map=1:RUFUS,2:QUATTRO,3:21/01/01 .... and so on
在Web服务上,我解析此Web参数并创建包含该内容的Java Map。
问题是当在web参数中有一个这样的符号时,“+” “,”和“%”。我无法过滤它们(用户可以输入它们)而且我不知道为什么在java端加上被视为空char(“”),它被视为数组分隔符(所以当我分裂时它会返回错误)用于解析它的web参数),%被视为无效的Web转义字符。
我想到了两个解决方案,但它们都没有适用于所有三个符号:
1)typescript encodeUrl或encodeUrlComponents函数
2)更改web参数类型,(如何直接传递地图??
以下是我解析http-request参数的方法:
Map<Integer, String> mappaQuery = new HashMap<Integer, String>();
for (String item : arrayQuery) {
String split[] = item.split(":");
mappaQuery.put(Integer.valueOf(split[0]), split[1]);
}
感谢您的帮助。我不知道我输入的内容是否足够清楚,请评论,我会更好地添加,英语不是我的主要语言。
答案 0 :(得分:0)
在你的Angular应用中试试这个:
class CustomEncodingCodec implements HttpParameterCodec {
private customEncoding(v: string): string {
return encodeURIComponent(v)
.replace(/%3A/gi, ':')
.replace(/%24/gi, '$')
.replace(/%2C/gi, ',')
.replace(/%3B/gi, ';')
.replace(/%3D/gi, '=')
.replace(/%3F/gi, '?')
.replace(/%2F/gi, '/');
}
encodeKey(k: string): string { return this.customEncoding(k); }
encodeValue(v: string): string { return this.customEncoding(v); }
decodeKey(k: string): string { return decodeURIComponent(k); }
decodeValue(v: string) { return decodeURIComponent(v); }
}
let httpParams = new HttpParams( { fromString: '', encoder: new CustomEncodingCodec() } );
然后将您的参数从地图传递给httpParams。
更多信息:https://angular.io/api/common/http/HttpUrlEncodingCodec
希望它会有所帮助。
答案 1 :(得分:0)
我已经成功了,即使它不是最优雅的方式。 我不得不接受这个解决方案,因为我在我的应用程序模块中具有特殊情况(Angular是一个REST WS,需要传递像元素一样的地图)。如果我能找到更好的解决方案,我会在这里写主题。
在Typescrypt部分,我在搜索和替换&#34;,&#34;之后对发送的数据进行了编码。字符。我用过|而不是:作为我的数组中的K / V分隔符。
nome.trim().replace(',', '%2C');
...
array.push(this.metaById[i].id + '|' + encodeURIComponent(this.metadatoForm[i]));
在java方面,解决方案不是那么优雅,但它涵盖了所有可能性:
Map<Integer, String> mappaQuery = new HashMap<Integer, String>();
for (String item : arrayQuery) {
String split[] = item.split("\\|");
if (split.length >= 2) {
if (item.contains("%2C")) {
mappaQuery.put(Integer.valueOf(split[0]), URLDecoder.decode(split[1], "UTF-8"));
} else {
mappaQuery.put(Integer.valueOf(split[0]), split[1]);
}
} else if (split.length == 1) {
mappaQuery.put(Integer.valueOf(split[0]), "|");
}
}
有了这个,我没有更多的问题传递,:%+和|在搜索中。注意我不解码URI组件,除非我收到编码的
希望这有助于其他人。