2013-10-08 81 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
相關問題