2017-07-26 6 views
0

Spring RESTfulサービスに、私のwebappが実行されているのと同じサーバーに接続しようとしています。Spring RestTemplate:URIが絶対ではありません

私はいくつかの環境(localhost、test、production)にインストールすることができるので、 "相対"パスを使用したいと思いますが、エラーメッセージ:URI is not absoluteが表示されます。

同じサーバー上の別のWebアプリケーションでサービスを実行するにはどうすればよいですか?

私のコードは次のようなものです:

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()); 
} 

感謝。

更新:

私はそれが正しいとエレガントな解決策になる可能性があり、requestから...など、ホスト、ポートを取得することにより、それを解決?これは私の実際の単純化されたコードです:

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"); 
} 
+3

エンコーディングはURLのnogです!そのパラメータ値です。この行を削除します: 'String urlEncoded = URLEncoder.encode(url、UTF_8);' –

+0

私はエンコードを削除しましたが、とにかく相対URLを指定する必要があります。ありがとう – Alessandro

+0

何に相対?コンテキストがなければ、アプリケーションは外部からのアクセス方法を知らない。 HttpServletRequestにアクセスすると、そのオブジェクトがあなたのアプリケーションがアクセスされたと考えるものを知ることができます。しかし、自分のJavaアプリケーションサーバーの前に逆プロキシがある場合は完璧である必要はありません。ブラウザーで実行されているJavaScriptコードでは相対リクエストを作成するのは簡単ですが、サーバーサイドアプリケーションでは難しいです。 –

答えて

0

あなたは最初のスニペットのあなたのコードとしてはできません。 URIは取得しようとしているリソースを完全に識別する必要があります。あなたの2番目のスニペットは、あなたがやろうとしていることを行うことができる唯一の方法です。他の方法もあるかもしれませんが、私は頭の上から何も考えられません。

もちろん、あなたのアプローチで、あなたのシステムアーキテクチャと展開モデル口述されている良いアイデアなることはほとんどありませんコード、中

0

お客様のURL app2/myservice?par=1サービスが別のWebアプリケーションまたは同じサーバーで実行されている場合は、完全ではありません。

ベースURLを指定することによってパスを完成させる必要があります。localhost:8080/yourApp/app2/myservice?par=1これで問題は解決します。

また、[パッケージアクセス]を確認します。

関連する問題