2012-02-09 34 views
2

我有一個現有的Java代碼服務層,我想在一些REST調用中使用它。我想這樣做的方式是讓用戶在URL中傳遞服務標識,然後在後端查找服務和方法(在DB或配置文件中)並調用它。例如:在Spring中使用REST調用來公開服務層

http://foobar.com/rest/car

當這個URL被調用時,我會採取 「車」 的服務ID,並調用CarService。我想我會有一個簡單的配置:

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

有沒有辦法使用Spring來做到這一點?我擔心的一個問題是沒有調用服務,但是要確定要調用哪種方法。如果我打電話給http://foobar.com/services/car/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'作爲你服務的參數? – 2012-02-09 15:28:05

回答

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 2012-02-10 16:18:09

0

而不是一個簡單的屬性文件,你有這...

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

...配置Spring(適當的調度配置文件中)來管理這些豆你:

<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;