14

Spring を使用して REST コントローラーを実装します。次に例を示します。

@Controller
@RequestMapping("/myservice") 
public class MyController {
    @RequestMapping(value = "foo", method = RequestMethod.GET)
    public @ResponseBody string foo() {...}
}

Spring RestTemplate を使用してこのサービスを呼び出すことができ、正常に動作しますが、文字列 url を使用したタイプレス呼び出しではなく、プロキシを使用して呼び出すことをお勧めします。

// client code:
MyController proxy = getProxy("baseUrl", MyController.class);
String results = proxy.foo();

したがって、プロキシ生成への入力は、REST の詳細を説明する注釈を含む Java インターフェイスです。この記事を読んだところ、すべてのタイプのリモート呼び出しにプロキシがあるようです。REST に必要なのはRestProxyFactoryBean、REST Java インターフェイスを取り、RestTemplate を実装として使用するタイプ セーフなプロキシを返すようなものだけです。

私が見つけた最も近い解決策はJBoss RESTEasyです。

@Controllerしかし、別の注釈セットを使用しているように見えるため、既に持っている注釈で機能するかどうかはわかりません@RequestMapping: 他のオプションはありますか、それとも RESTEasy だけですか? 注意してください、私は春の初心者なので、いくつかの明らかな春の事柄は私にとってかなり新しいものです。

ありがとうございました。
ディマ

4

6 に答える 6

3

軽量のプロキシベースの REST クライアントであるFeign by Netflixを試すことができます。アノテーションを介して宣言的に機能し、Spring Cloud プロジェクトで Netflix Eureka と対話するために使用されます。

于 2016-02-18T17:58:16.307 に答える
1

REST パラダイムが発明された理由の 1 つは、他のリモーティング テクノロジ (RMI、CORBA、SOAP) の経験から、プロキシ ベースのアプローチは解決するよりも多くの問題を生み出すことが多いことを示しているためです。

理論的には、プロキシは、関数呼び出しがリモートで透過的であるという事実をユーザーに伝えるため、ローカル関数呼び出しとまったく同じように関数を使用できます。

ただし、実際には、リモート関数呼び出しはローカル呼び出し以外のプロパティを持っているだけなので、この約束を果たすことはできません。ネットワークの停止、輻輳、タイムアウト、負荷の問題などはほんの数例です。リモート呼び出しで問題が発生する可能性があるこれらすべてのことを無視することを選択した場合、コードはおそらくあまり安定しません。

TL;DR: おそらくプロキシを使用するべきではありません。プロキシはもはや最先端ではありません。を使用するだけRestTemplateです。

于 2014-11-27T15:06:25.563 に答える
1

これは、コントローラーのアノテーションからランタイム プロキシを生成しようとするプロジェクトです (バックグラウンドで RestTemplate を使用してプロキシ呼び出しを処理します): spring-rest-proxy-clientただし、実装の非常に初期の段階です。

于 2015-11-25T12:25:42.747 に答える
0

https://github.com/ggeorgovassilis/spring-rest-invokerをご覧ください。必要なのは、FactoryBean を登録することだけです。

@Configuration
public class MyConfiguration {

    @Bean
    SpringRestInvokerProxyFactoryBean BankService() {
        SpringRestInvokerProxyFactoryBean proxyFactory = new SpringRestInvokerProxyFactoryBean();
        proxyFactory.setBaseUrl("http://localhost/bankservice");
        proxyFactory.setRemoteServiceInterfaceClass(BankService.class);
        return proxyFactory;
    }

その後、インターフェースクラスを自動配線できます:

@Autowired
BookService bookService;
于 2019-03-17T22:41:46.557 に答える