Java SpringRestTemplate:URI不是绝对的

Java SpringRestTemplate:URI不是绝对的,java,spring,uri,Java,Spring,Uri,我正在尝试连接到运行webapp的同一服务器上的springrestful服务 我希望使用“相对”路径,因为它可以安装在多个环境(本地主机、测试、生产)上,但我收到错误消息:URI不是绝对的 如何调用在同一服务器上的另一个webapp上运行的服务 我的代码如下所示: final RestTemplate restTemplate = new RestTemplate(); URI uri; try { String url = "app2/myservice?par=1"; ur

我正在尝试连接到运行webapp的同一服务器上的springrestful服务

我希望使用“相对”路径,因为它可以安装在多个环境(本地主机、测试、生产)上,但我收到错误消息:
URI不是绝对的

如何调用在同一服务器上的另一个webapp上运行的服务

我的代码如下所示:

final RestTemplate restTemplate = new RestTemplate();
URI uri;
try {
    String url = "app2/myservice?par=1";
    uri = new URI(url);
    String result = restTemplate.getForObject(uri, String.class);
    System.out.println(result);
} catch (URISyntaxException e) {
    logger.error(e.getMessage());
}
谢谢

更新:

我通过获取主机、端口等解决了此问题。。。根据
请求
,这是一个正确而优雅的解决方案吗?这是我实际的简化代码:

String scheme = request.getScheme();
String userInfo = request.getRemoteUser();
String host = request.getLocalAddr();
int port = request.getLocalPort();
String path = "/app2/myservice";
String query = "par=1";
URI uri = new URI(scheme, userInfo, host, port, path, query, null);
boolean isOK = restTemplate.getForObject(uri, Boolean.class);
if (isOK) {
    System.out.println("Is OK");
}

不能像第一个代码片段中的代码那样执行此操作;URI必须完全标识您试图访问的资源。你的第二个片段几乎是你做你想做的事情的唯一方式。也许还有其他办法,但我想不出任何办法


当然,按照您的方法,您在代码中口述您的系统架构和部署模型,这几乎不是一个好主意。

如果您的服务运行在另一个web应用程序或同一台服务器上,则您的URL
app2/myservice?par=1

您必须通过给出基本URL means
localhost:8080/yourApp/app2/myservice?par=1来完成路径,然后事情可能适合您


另外,请检查软件包访问。

提供一个完整路径,如
希望这能有所帮助。

URL编码不适用!它用于参数值。删除这一行:
String urlEncoded=URLEncoder.encode(url,UTF_8)好的,我删除了编码,但无论如何我需要指定一个相对url,这可能吗?谢谢与什么有关?如果没有任何上下文,应用程序就不知道它是如何被外部访问的。如果您有权访问HttpServletRequest,那么您可以看到该对象认为您的应用程序是在什么位置被访问的,但是如果您自己的Java应用程序服务器前面有反向代理,那么即使这样也不一定完美。对于在浏览器中运行的javascript代码来说,发出相对请求很容易,但对于服务器端应用程序来说却很难。@ErwinBolwidt相对于当前请求,我更新了我的问题,我当前的代码是什么?感谢您可能忘记了Url的主机名(例如localhost:8080)。。。