RestTemplate - UriTemplate找不到他的正则表达式的端口

时间:2014-05-14 21:36:54

标签: java spring spring-mvc resttemplate

我在使用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和我上面所说的内容处理时,:会更改为/

0 个答案:

没有答案