如何强制URIBuilder.path(...)编码参数如"%AD"?
的方法path,replacePath和segment的URIBuilder并不总是编码参数与百分比,正确.
当参数包含字符"%"后跟两个字符一起形成URL编码字符时,"%"不会编码为"%25".
例如
URI uri = UriBuilder.fromUri("https://dummy.com").queryParam("param", "%AD");
String test = uri.build().toString();
Run Code Online (Sandbox Code Playgroud)
"test"是" https://dummy.com?param=%AD "
但它应该是" https://dummy.com?param=%25AD "(字符"%"编码为"%25")
UriBuilderImpl.queryParam(...)当"%"后面的两个字符是十六进制时,该方法的行为与此类似.即,方法"com.sun.jersey.api.uri.UriComponent.isHexCharacter(char)"对于"%"之后的字符返回true.
我认为UriBuilderImpl的行为是正确的,因为我猜它试图不编码已编码的参数.但在我的场景中,我永远不会尝试使用已经编码的参数创建URL.
我该怎么办?
我的Web应用程序使用新泽西州,在许多地方我建立一个使用类UriBuilder的URI或调用该方法getBaseUriBuilder的UriInfo对象.
每次调用方法时queryParam,我都可以用"%25"替换"%" ,replaceQueryParam或者segment.但我正在寻找一个不那么麻烦的解决方案.
如何让Jersey返回我自己的UriBuilder实现?
我想过创建一个扩展UriBuilderImpl的类来覆盖这些方法,并在调用之前执行此替换super.queryParam(...)或其他任何操作.
在调用UriBuilder.fromURL(...)UriInfo.getBaseUriBuilder(...)等时,有没有办法让Jersey返回我自己的UriBuilder而不是UriBuilderImpl ?
看看这个方法RuntimeDelegate,我想到了扩展RuntimeDelegateImpl.我的实现将覆盖该方法createUriBuilder(...),该方法将返回我自己的方法UriBuilder,而不是UriBuilderImpl.然后,我会添加文件,META-INF/services/javax.ws.rs.ext.RuntimeDelegate并在其中,我的完整的类名称RuntimeDelegateImpl.
问题是jersey-bundle.jar已包含META-INF/services/javax.ws.rs.ext.RuntimeDelegate指向的内容com.sun.jersey.server.impl.provider.RuntimeDelegateImpl,因此容器加载该文件而不是my javax.ws.rs.ext.RuntimeDelegate.因此,它不会加载我的RuntimeDelegate实现. …