В пролетното ми 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
Всички тези сервизни класове ще изпълняват aосновен интерфейс. Не искам да правя тази инстанция в моя Java код. Как мога да преместя това в конфигурационен файл. Как мога да инжектирам тези обекти динамично въз основа на стойностите на заявката. Моля, имайте предвид, че използвам пояснения. Аз съм нов за spring.Please съветвам
EDIT: Да включа моето решение
В моя 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. Това ли е правилният начин?
Отговори:
3 за отговор № 1- Създайте FactoryBean, който създава един от всички възможни случаи
- Използвайте държавния държач на конеца
RequestAttributes
за да получи искането - Направете контролера на
@Scope("request")
- Инжектирайте услугата чрез интерфейс
Това трябва да улесни контролера. Но това е грозен подход. Ето още един:
- Инжектирайте a
List<YourInterface>
- Определете метод в интерфейса
getImplementationId()
- За всяко искане повторете списъка и изберете инструмента, който връща правилното идентификатор
Вариант на това би бил или:
- препоплетете карта с ключ - ключът, идващ от json, и стойност - специфичен IMPL
- Включете копчето jsod в името на зърното за внедряване и инжектирайте a
Map<String, YourInterface>
След това търсете с ключ