如何强制URIBuilder.path(...)
对参数进行编码,例如"%AD"
?
方法path
和replacePath
并不总是正确地用百分比编码参数segment
。URIBuilder
当参数包含字符“%”后跟两个字符共同构成 URL 编码字符时,“%”不编码为“%25”。
例如
URI uri = UriBuilder.fromUri("https://dummy.com").queryParam("param", "%AD");
String test = uri.build().toString();
"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 应用程序使用 Jersey,并且在许多地方我使用类 UriBuilder 构建 URI 或调用对象的方法getBaseUriBuilder
。UriInfo
每次调用方法时,我都可以将“%”替换为“%25” queryParam
,replaceQueryParam
或者segment
。但我正在寻找一个不那么繁琐的解决方案。
如何让 Jersey 返回我自己的 UriBuilder 实现?
super.queryParam(...)
我想创建一个扩展 UriBuilderImpl 的类,该类覆盖这些方法并在调用或其他任何操作之前执行此替换。
有什么方法可以让 Jersey 在调用UriBuilder.fromURL(...)
UriInfo.getBaseUriBuilder(...) 等时返回我自己的 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
,因此容器加载该文件而不是我的javax.ws.rs.ext.RuntimeDelegate
. 因此,它不会加载我的RuntimeDelegate
实现。
是否可以提供我自己的实现RuntimeDelegate
?
我应该采取不同的方法吗?