这是我正在做的事情的前提:
- 使用简单的servlet获取页面请求
- 从请求中获取页面ID以确定我所在的页面
- 在bean xml配置中定义控制器
- 使用bean定义来确定要使用的页面控制器类。
- 所有这些页面控制器都扩展了CORE.Controllers.PageController类。
这是我想要做的,但失败了。我正在尝试将页面控制器类(PersonController,由bean确定)加载到PageController变量中。您将在我的代码示例中看到的是我将它转换为PageController类。这不起作用。
如何使用多态性将我的PersonController对象从bean工厂中获取到我的变量中?
<?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);
答案 0 :(得分:1)
感谢您的更新。我想我现在明白了 - 你想避免演员表演PageController
。
替换
PageController controller = (PageController)controllerFactory
.getBean(page.getControllerName());
与
PageController controller = controllerFactory
.getBean(page.getControllerName(), PageController.class);
Spring允许您使用期望bean的类型来参数化getBean
调用。在“引擎盖下”的实施方面,它仍然是一个演员,如果命名的bean与所请求的类型不对应,你将获得ClassCastException
,但至少现在编译器通过泛型来处理它。
答案 1 :(得分:0)
在Spring中,如果我们使用JDK代理(如下面更正的@mdma),我们不能将对象强制转换为具体的类实例,我们只能将它转换为接口实例。在这种情况下,您需要将PageController更改为一个接口并为其创建一个实现,名为PageControllerImpl并在您的controller-cfg.xml中声明它。
如果使用CGLIB,您的代码可能没问题。