2012-02-09 14 views
2

私は、いくつかのREST呼び出しで使用したいJavaコードの既存のサービス層を持っています。私がこれをやりたいのは、ユーザーがURLのサービスIDを渡してから、バックエンドでサービスとメソッド(DBまたは設定ファイル内)を検索して呼び出すことです。たとえば、このURLが呼び出されるとSpringでREST呼び出しを使用してサービス層を公開する

http://foobar.com/rest/car

、私は「車」のサービスIDを取得し、CarServiceを呼び出します。

car=com.foobar.services.CarService 
house=com.foobar.services.HouseService 
etc.. 

Springを使ってこれを行う方法はありますか?私が持っている懸念は、サービスを呼び出すことではなく、どのメソッドを呼び出すかを理解することです。 http://foobar.com/services/car/redへの呼び出しがあった場合、どのメソッドを 'red'のメソッドパラメータに渡して、どのメソッドを呼び出すかを決定します。ここで

が、これはJavaでどのように見えるかの例です:

@RequestMapping(value = "{serviceId}") 
@ResponseBody 
public Object getMarshalledObject(@PathVariable String serviceId) { 

    if ("car".equals(serviceId)) { 
     return getCar(); 
    } 
    throw new ServiceNotFoundException("Service ID not found."); 
} 
+0

あなたの質問から、あなたのURLから値 'red'を抽出する方法、またはあなたのサービスの引数として' red'値を使用する方法はありますか? –

答えて

6

それはリクエストから関連情報を抽出した後、私はサービスごとに別々のコントローラを作成し、それに対応するサービスに、各コントローラのデリゲートを持っているでしょう。

ためのコントローラとそのメソッドの@RequestMappingの性質上、これはかなり簡単なはず:私たちはここにある何

@RequestMapping("/car") 
class CarController { 
    @Autowired 
    private CarService service; 

    @RequestMapping("/{color}") 
    public Object getCarsByColor(@PathVariable String carColor) { 
     return service.getCarsByColor(houseColor); 
    } 
} 

@RequestMapping("/house") 
class HouseController { 
    @Autowired 
    private HouseService service; 

    @RequestMapping("/{houseId}") 
    public Object getHouseById(@PathVariable int houseId) { 
     return service.getHouseById(houseId); 
    } 
} 

がある@RequestMappingによってマップされているさまざまなサービスと、二つの異なるコントローラでありますクラスに適用されます。さらに、コントローラメソッドは、urlから残りのパス要素によって呼び出されます。あなたがこれを持っているところ、単純なプロパティファイルの代わりに

+0

これは最も理にかなっています。ありがとう!! – acvcu

0

...

car=com.foobar.services.CarService 
house=com.foobar.services.HouseService 

...あなたのためにこれらのBeanを管理するために、(適切なディスパッチ・コンフィギュレーション・ファイルに)春を設定:

<bean id="car" class="com.foobar.services.CarService" /> 
<bean id="house" class="com.foobar.services.HouseService" /> 

あなたのサービスクラスが共通のインターフェース(例えば、com.foobar.services.BaseService)を実装していると仮定すると、あなたのコントローラーでは、次のようにそれらを自動配線できます:

@Autowired 
@Qualifier("car") 
private BaseService _carService; 

@Autowired 
@Qualifier("house") 
private BaseService _houseService; 
関連する問題