2013-10-08 70 views
1

我需要使用一个控制器类为具有不同ID的静态页面创建多个bean,该控制器类具有一个用于定义要显示的jsp名称的属性。在春天将单个控制器映射到多个bean

我曾经使用FormControllers使用旧版本要做到这一点,但我不能在版本3.2.4 我检查了几个主题,明白的Spring bean是单身,但 我想知道这是可能的,或者如果有一个避免为每个页面创建空的控制器类。

这里是BaseController类:

public class BaseController extends AbstractController { 

    public String contentPage; 

    @Override 
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 
     ModelAndView mv = new ModelAndView("common/mainlayout"); 

     if(contentPage != null && !contentPage.equals("")){ 
      mv.addObject("mainContent", "maincontent/" + contentPage); 
      mv.addObject("mainMenuSelect", contentPage); 
     } 

     return mv; 
    } 

    public String getContentPage() { 
     return contentPage; 
    } 
    public void setContentPage(String contentPage) { 
     this.contentPage = contentPage; 
    } 
} 

这是我在为spring-servlet.xml注意映射,我也用我的BaseController

<bean id="urlMapping" 
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
     <props> 

      <!-- STATIC PAGES --> 
      <prop key="/index.dlg">indexPageController</prop> 
      <prop key="/faq.dlg">faqController</prop> 
      <prop key="/howto.dlg">howtoController</prop> 
      <prop key="/contactUs.dlg">contactUsController</prop> 
      <prop key="/aboutUs.dlg">aboutUsController</prop> 

      <!-- DYNAMIC PAGES --> 
      <prop key="/postBox.dlg">postBoxController</prop> 
      <prop key="/invoiceBox.dlg">invoiceController</prop> 
     </props> 
    </property> 

    <property name="interceptors"> 
     <list> 
      <ref bean="siteInterceptor" /> 
     </list> 
    </property> 

</bean> 

<bean id="siteInterceptor" class="com.entegrator.spring.interceptor.SiteInterceptor"></bean> 

<!-- STATIC PAGE CONTROLLERS --> 
<bean id="baseController" abstract="true" class="com.entegrator.spring.controller.BaseController" /> 

<bean id="indexPageController" parent="baseController" > 
    <property name="contentPage" value="index" /> 
</bean> 

<bean id="faqController" parent="baseController" > 
    <property name="contentPage" value="faq" /> 
</bean> 

<bean id="howtoController" parent="baseController" > 
    <property name="contentPage" value="howto" /> 
</bean> 

<bean id="contactUsController" parent="baseController" > 
    <property name="contentPage" value="contactUs" /> 
</bean> 

<bean id="aboutUsController" parent="baseController" > 
    <property name="contentPage" value="aboutUs" /> 
</bean> 
<!-- STATIC PAGE CONTROLLERS END --> 


<!-- DYNAMIC PAGE CONTROLLERS --> 
<bean id="postBoxController" class="com.entegrator.spring.controller.PostBoxController"> 
    <property name="postBoxManager" ref="postBoxManager" /> 
</bean> 
<bean id="invoiceController" class="com.entegrator.spring.controller.InvoiceController"> 
    <property name="postBoxManager" ref="postBoxManager" /> 
</bean> 
<!-- DYNAMIC PAGE CONTROLLERS END --> 

我的网站试图定义类的每个bean的。 XML是:

<display-name>EntegratorPortal</display-name> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 


    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>*.dlg</url-pattern> 
    </servlet-mapping> 

这是我的错误日志:

SEVERE: StandardWrapper.Throwable 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping#0' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler 'faqController' to URL path [/base*]: There is already handler 'indexPageController' mapped. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:865) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:136) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.IllegalStateException: Cannot map handler 'faqController' to URL path [/base*]: There is already handler 'indexPageController' mapped. 
    at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:294) 
    at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:266) 
    at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82) 
    at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58) 
    at org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:119) 
    at org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:72) 
    at org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73) 
    at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:117) 
    at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:92) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:396) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1475) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521) 
    ... 32 more 

感谢您的帮助

+0

为什么他们需要请求范围?没有任何内容需要请求范围,所以为什么会增加复杂性。没有什么能够阻止你做你想做的事情,但是你也有一个ControllerClassNameHandlerMapping的地方,它也在检测控制器(又是什么?)。至少有些东西会导致重复的映射。 –

+0

我删除了范围参数,只是测试它。我想你的一个额外的处理程序的建议是由于URL警告(URL路径[/ base *]),你可能是正确的。但我没有添加任何额外的处理程序。我只是添加了所有的弹簧罐,以确保我尽可能快地创建了该项目。有没有办法检查我是否有控制器的额外处理程序并删除它? – ozgurc

+0

在某处配置了一个ControllerClassNameHandlerMapping,但是您只能将单个控制器映射到URL。 –

回答

0

你能不能简单地与@RequestMapping注解的方法(值=“/ foo”的方法=“RequestMethod.GET”)的一个控制器,用于每个页面内?

这似乎是最简单的解决方案。

你的控制器将是这个样子:

@Controller 
public class BaseController 
{ 

    @RequestMapping(value="/index", method="RequestMethod.GET") 
    public String returnIndexPage() 
    { 
     return "Your Index JSP Page Location Here"; 
    } 

    @RequestMapping(value="/faq", method="RequestMethod.GET") 
    public String returnFAQPage() 
    { 
     return("Your FAQ JSP Page Location Here"; 
    } 

等等

,如果你喜欢,你可以将它修改为只返回内容页面的变量。

这肯定会起作用。

让我知道你如何继续。

+0

我创建此项目的方式是标准的所有我们的项目,所以我没有太多的选择来使用这个解决方案,除非我真的需要但我会牢记它。 – ozgurc

0

为什么不利用新的弹簧@Controller@RequestMapping注释?这样你只需要一个控制器。然后

@Controller 
public class StaticController { 


    @RequestMapping({"/index.dlg", "/howto", // The rest of your mappings} 
    public String handleStatic(HttpServletRequest request, Model model) { 
     String contentPage = //Extract page-name from request 
     model.addObject("mainContent", "maincontent/" + contentPage); 
     model.addObject("mainMenuSelect", contentPage); 
     return "common/mainlayout";  
    } 
} 

该控制器可以被检测,并通过使用RequestMappingHandlermapping设置和由RequestMappingHandlerAdapter执行(那些通过在XML配置使用<mvc:annotation-driven />注册)。

或利用弹簧视图 - 控制器(<mvc:view-controller .. />),并添加一个拦截器所需要的属性添加到模型

<mvc:view-controller path="/index.dlg" view-name="common/mainlayout" /> 
<mvc:view-controller path="/faq.dlg" view-name="common/mainlayout" /> 

<mvc:interceptors> 
    <mvc:interceptor> 
     <mapping path="/index.dlg" /> 
     <mapping path="/faq/dlg" /> 
     <bean class="YourInterceptor" /> 
    </mvc:interceptor> 
</mvc:interceptors> 

这种方法的缺点是,你基本上是复制你的映射(一旦控制器和一次为拦截器)。

链接

  1. 实现控制器reference guide
  2. 视图控制器reference guide
  3. 配置拦截reference guide
相关问题