有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

http://foobar.com/rest/car

当这个URL被调用时,我会使用serviceId“car”并调用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) 个答案

  1. # 1 楼答案

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

    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;
    
  2. # 2 楼答案

    我会为每个服务创建单独的控制器,并在每个控制器从请求中提取相关信息后,将其委托给相应的服务

    由于控制器及其方法的@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中的剩余路径元素调用