Как я могу использовать полиморфизм со Spring Beans? - PullRequest
1 голос
/ 15 апреля 2011

Вот предпосылка для того, что я делаю:
- Используйте простой сервлет для получения запросов страниц.
- Получите идентификатор страницы из запроса, чтобы определить, на какой странице я нахожусь.
- Определите контроллеры в XML-конфигурации bean-компонентов.
- Используйте определение bean-компонента, чтобы определить, какой класс контроллеров страниц использовать.- Все эти контроллеры страниц расширяют класс CORE.Controllers.PageController.

Вот что я пытаюсь сделать, но безуспешно.Я пытаюсь загрузить класс контроллера страницы (PersonController, который был определен из bean-компонентов) в переменную PageController.В моем примере кода вы увидите, что я приведу его к классу PageController.Это не работает

Как мне получить мой объект PersonController из фабрики бинов, используя полиморфизм, в мою переменную?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- -->
<bean id="home" name="home" class="CORE.Controllers.HomeController" />
<bean id="person" name="person" class="CORE.Controllers.PersonController" />

<!-- Property Management -->
<bean id="propertyEvaluator" class="CORE.Controllers.PropertyManagement.PropertyEvaluator" />
</beans>

Класс здесь частично:

String pageId = "home";
    if (request.getParameter("PID") != null)
    {
        pageId = request.getParameter("PID");
    }

    response.setContentType("text/html; charset=UTF-8"); // Set content type for HTML.
    PrintWriter out = response.getWriter(); // Output goes to the response PrintWriter.
    try
    {
        TransformerFactory tFactory = TransformerFactory.newInstance();
        String ctx = getServletContext().getRealPath("") + FS; //get the real path for xml and xsl files.

        BeanFactory pageFactory = new XmlBeanFactory(new FileSystemResource(ctx+"WEB-INF/page-cfg.xml"));
        PageMapping pageMap = (PageMapping) pageFactory.getBean("pageMapping");
        Page page = pageMap.getPageById(pageId);

        BeanFactory controllerFactory = new XmlBeanFactory(new FileSystemResource(ctx+"WEB-INF/controller-cfg.xml"));
        PageController controller = (PageController) controllerFactory.getBean(page.getControllerName());
        controller.setRequest(request);

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Спасибо за обновление.Я думаю, теперь я понимаю - вы хотите избежать приведения к PageController.

Заменить

PageController controller = (PageController)controllerFactory
    .getBean(page.getControllerName());

на

PageController controller = controllerFactory
    .getBean(page.getControllerName(), PageController.class);

Spring позволяет вам параметризовать getBean вызов с типом ожидаемого бина.С точки зрения имплементации "под капотом" это все еще приведение, и вы получите ClassCastException, если именованный бин не соответствует запрошенному типу, но по крайней мере теперь компилятор обрабатывает это с помощью обобщений.

0 голосов
/ 15 апреля 2011

Весной, если мы используем JDK-прокси (как @mdma исправлено ниже), мы не можем привести объект к конкретному экземпляру класса, мы можем привести его только к экземпляру интерфейса. В этом случае вам нужно изменить PageController на интерфейс и создать для него реализацию с именем PageControllerImpl и объявить его в вашем controller-cfg.xml.

Если используется CGLIB, ваш код может быть в порядке.

...