Использование вызовов REST в Spring для предоставления сервисного уровня - PullRequest
2 голосов
/ 09 февраля 2012

У меня есть сервисный уровень Java-кода, который я хотел бы использовать в некоторых вызовах REST. Я хотел бы сделать так, чтобы пользователь передал идентификатор службы в URL-адресе, а затем во внутреннем поиске службы и метода (в БД или в файле конфигурации) и вызвал его. Например:

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 ]

6 голосов
/ 09 февраля 2012

Я бы сделал отдельные контроллеры для каждой службы, и каждый контроллер должен делегировать свою соответствующую службу после извлечения соответствующей информации из запроса.

Из-за природы @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 голосов
/ 09 февраля 2012

Вместо простого файла свойств, где у вас есть это ...

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...