Spring MVC 3.0 - сервисный уровень с использованием аннотаций - PullRequest
1 голос
/ 18 августа 2011

В моем приложении Spring MVC с одним классом контроллера

@Controller
public class MyController {
@RequestMapping(method = RequestMethod.POST, value = "/*.htm")
public myMethod{@RequestBody final MyRequestBean myRequest}

}

Мой ввод в форме JSON, и я использую Джексона для преобразования его в объект Java. Теперь, основываясь на свойстве объекта Java, я хочу отправить его в соответствующий класс обслуживания. Если это так,

myRequest.value == "1" -> FirstService
myRequest.value == "2" -> SecondService

Все эти классы Service будут реализовывать базовый интерфейс. Я не хочу делать это в моем Java-коде. Как я могу переместить это в файл конфигурации. Как я могу вводить эти объекты динамически на основе значений запроса. Обратите внимание, что я использую аннотации. Я новичок в весне. Пожалуйста, сообщите

РЕДАКТИРОВАТЬ: включить мое решение
В моем dispatcher.xml,

`<util:map id="myMap">
<entry key="service1" value="com.service.MyService1" /> 
<entry key="service2" value="com.service.MyService1" />
</util:map>` 

В моем контроллере,

@Resource private Map myMap;

и в методе внутри контроллера
MyService myService = (MyService) Class.forName((String)myMap.get(myRequest.getValue())).newInstance(); System.out.println("My value" + myService.doService());

Как видно, использовали отражение Java для получения экземпляра из строки, возвращенной из моего XML. Это правильный путь?

1 Ответ

3 голосов
/ 18 августа 2011
  1. Создать FactoryBean, который создает один из всех возможных экземпляров
  2. Используйте локальный держатель потока RequestAttributes для получения запроса
  3. Сделай контроллер из @Scope("request")
  4. Внедрить услугу через интерфейс

Это должно облегчить работу контроллера. Но это уродливый подход. Вот еще один:

  1. Внедрить List<YourInterface>
  2. Определение метода в интерфейсе getImplementationId()
  3. При каждом запросе выполняйте итерацию списка и выбирайте значение, которое возвращает правильный идентификатор

Вариация этого будет либо:

  • предварительно заполнить карту ключом - ключом от json, а значение - определенным значением
  • Включите ключ jsod в имя компонента реализации и введите Map<String, YourInterface>

Затем поиск по ключу

...