我在使用RestTemplate尝试在URI中指定服务器端口时遇到问题。问题似乎与它所构建的uri的方式有关,因为我正在调试并发现在UriTemplate
的构造函数中,String uriTemplate的值是:
{protocol}://{host}:{port}/{entity}/{method}
但是当变量uriComponents
被初始化时:
this.uriComponents = UriComponentsBuilder.fromUriString(uriTemplate).build();
分配的值为:
{protocol}://{host}/{port}/{entity}/{method}
问题很明显......将主机与端口分开的:
已转换为/
。
我认为问题是它用于构建uriComponents的正则表达式,端口的正则表达式为:(:(\d*))
我应该如何构建uriTemplate才能使用端口号? 感谢
编辑:代码示例
我无法发布完整的代码示例,因为它应该太长,但这里是用于此案例的片段。
首先,定义常量和基本URL:
protected static final String PROPERTY_METHOD = "method";
protected static final String PROPERTY_ENTITY = "entity";
protected static final String PROPERTY_HOST = "host";
protected static final String PROPERTY_PORT = "port";
protected static final String PROPERTY_PROTOCOL = "protocol";
protected static final String PROPERTY_BASE_URL = String.format(
"{%s}://{%s}:{%s}/{%s}/{%s}", PROPERTY_PROTOCOL,
PROPERTY_HOST, PROPERTY_PORT, PROPERTY_ENTITY, PROPERTY_METHOD);
有些属性通过setter注入初始化,我有一个方法来构建一个带有值的地图:
protected Map<String, Object> buildBaseUrlVariables() {
Map<String, Object> query = new HashMap<>();
query.put(PROPERTY_PROTOCOL, getHttpProtocol());
query.put(PROPERTY_HOST, getHostName());
query.put(PROPERTY_PORT, getPort());
query.put(PROPERTY_ENTITY, getEntityName());
query.put(PROPERTY_METHOD, getMethod());
return query;
}
最后,当urlTemplate
是上面定义的常量时,我有一个方法来做帖子。
protected <T> T genericPostData(String urlTemplate, Class<T> class1, Map<String, Object> urlVariables) {
LOGGER.debug("posting data for class {} template:{} data:{}",
new Object[] { class1, urlTemplate, urlVariables });
try {
return getRestTemplate().postForObject(urlTemplate, urlVariables, class1,
urlVariables);
} catch (HttpClientErrorException e) {
analizeHttpClientErrorException(e);
} catch (RestClientException e) {
throw new DataAccessException(e);
}
return null;
}
当这个urlTemplate由restTemplate和我上面所说的内容处理时,:
会更改为/