在Spring中使用REST调用来公开服务层

时间:2012-02-09 15:12:57

标签: java spring spring-mvc

我有一个现有的Java代码服务层,我想在一些REST调用中使用它。我想这样做的方法是让用户传入URL中的服务ID,然后在后端查找服务和方法(在DB或配置文件中)并调用它。例如:

  

http://foobar.com/rest/car

当调用此URL时,我将使用“car”的serviceId并调用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.");
}

2 个答案:

答案 0 :(得分: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的剩余路径元素调用。

答案 1 :(得分:0)

而不是一个简单的属性文件,你有这个......

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

...配置Spring(在相应的调度配置文件中)为您管理这些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;