2013-09-21 101 views
3

我正在使用Spring mvc進行項目工作,並且我在啓動服務器時處理自動生成處理程序的問題。Spring mvc控制器bean配置

下面是代碼:

控制器

@Controller 
@RequestMapping(value="userstory/{projectid}/{sprintid}/") 
@SessionAttributes(value = "user") 
public class UserstoryController { 
    private ISprintService sprintService; 
    private IUserStoryService userStoryService; 
    private IProjectService projectService; 
    private IBurnDownChartService burnDownChartService; 
    private ITaskService taskService; 

    public void setSprintService(ISprintService sprintService) { 
     this.sprintService = sprintService; 
    } 

    public void setUserStoryService(IUserStoryService userStoryService) { 
     this.userStoryService = userStoryService; 
    } 

    public void setProjectService(IProjectService projectService) { 
     this.projectService = projectService; 
    } 

    public void setBurnDownChartService(IBurnDownChartService burnDownChartService) { 
     this.burnDownChartService = burnDownChartService; 
    } 

    public void setTaskService(ITaskService taskService) { 
     this.taskService = taskService; 
    } 

    @RequestMapping(method=RequestMethod.GET) 
    public String getUserstoryPage(@PathVariable("projectid") int pid, @PathVariable("sprintid") int sid, @ModelAttribute("user") SerializablePerson user) { 
     if (user.getId() != 0) { 
      Project p = this.projectService.findProjectById(pid); 
      if (p == null) { 
       throw new ResourceNotFoundException(pid); 
      } 
      if (user.getRole().equals("User")) { 
       return "userstory/user_userstory"; 
      } 
      else { 
       return "userstory/admin_userstory"; 
      } 
     } 
     return "redirect:../../../login"; 
    } 

} 

的beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="personServiceImpl" class="ch.bsgroup.scrumit.service.impl.PersonServiceImpl" /> 
    <bean id="projectServiceImpl" class="ch.bsgroup.scrumit.service.impl.ProjectServiceImpl" /> 
    <bean id="sprintServiceImpl" class="ch.bsgroup.scrumit.service.impl.SprintServiceImpl" /> 
    <bean id="userStoryServiceImpl" class="ch.bsgroup.scrumit.service.impl.UserStoryServiceImpl" /> 
    <bean id="taskServiceImpl" class="ch.bsgroup.scrumit.service.impl.TaskServiceImpl" /> 

    <bean id="projectService" class="ch.bsgroup.scrumit.service.impl.ProjectServiceImpl" /> 
    <bean id="personService" class="ch.bsgroup.scrumit.service.impl.PersonServiceImpl" /> 

    <bean id="sprintService" class="ch.bsgroup.scrumit.service.impl.SprintServiceImpl" /> 
    <bean id="userStoryService" class="ch.bsgroup.scrumit.service.impl.UserStoryServiceImpl" /> 
    <bean id="burnDownChartService" class="ch.bsgroup.scrumit.service.impl.BurnDownChartServiceImpl" /> 
    <bean id="taskService" class="ch.bsgroup.scrumit.service.impl.TaskServiceImpl" /> 

    <bean id="sprintUserstoryController" class="ch.bsgroup.scrumit.controller.SprintUserstoryController"> 
     <property name="sprintService"> 
      <ref local="sprintService"/> 
     </property> 
     <property name="userStoryService"> 
      <ref local="userStoryService"/> 
     </property> 
     <property name="projectService"> 
      <ref local="projectService"/> 
     </property> 
     <property name="burnDownChartService"> 
      <ref local="burnDownChartService"/> 
     </property> 
     <property name="taskService"> 
      <ref local="taskService"/> 
     </property> 
    </bean> 

    <bean id="boardController" class="ch.bsgroup.scrumit.controller.BoardController"> 
     <property name="sprintService"> 
      <ref local="sprintService"/> 
     </property> 
     <property name="projectService"> 
      <ref local="projectService"/> 
     </property> 
     <property name="userStoryService"> 
      <ref local="userStoryService"/> 
     </property> 
     <property name="taskService"> 
      <ref local="taskService"/> 
     </property> 
     <property name="burnDownChartService"> 
      <ref local="burnDownChartService"/> 
     </property> 
    </bean> 

    <bean name="register.jsp" id="registerController" class="ch.bsgroup.scrumit.controller.RegisterController"> 
     <property name="personService"> 
      <ref local="personService"/> 
     </property> 
    </bean> 

    <bean id="loginController" class="ch.bsgroup.scrumit.controller.LoginController" > 
     <property name="personService"> 
      <ref local="personService"/> 
     </property> 
    </bean> 

    <bean id="adminProjectController" class="ch.bsgroup.scrumit.controller.AdminProjectController"> 
     <property name="projectService"> 
      <ref local="projectService"/> 
     </property> 
     <property name="personService"> 
      <ref local="personService"/> 
     </property> 
    </bean> 

    <bean id="userProjectController" class="ch.bsgroup.scrumit.controller.UserProjectController"> 
     <property name="projectService"> 
      <ref local="projectService"/> 
     </property> 
    </bean> 

    <bean id="adminPersonController" class="ch.bsgroup.scrumit.controller.AdminPersonController"> 
     <property name="projectService"> 
      <ref local="projectService"/> 
     </property> 
     <property name="personService"> 
      <ref local="personService"/> 
     </property> 
    </bean> 

    <bean id="manageProjectMemberController" class="ch.bsgroup.scrumit.controller.ManageProjectMemberController"> 
     <property name="projectService"> 
      <ref local="projectService"/> 
     </property> 
     <property name="personService"> 
      <ref local="personService"/> 
     </property> 
    </bean> 

    <bean id="manageUserstoryController" class="ch.bsgroup.scrumit.controller.UserstoryController"> 
     <property name="sprintService"> 
      <ref local="sprintService"/> 
     </property> 
     <property name="userStoryService"> 
      <ref local="userStoryService"/> 
     </property> 
     <property name="projectService"> 
      <ref local="projectService"/> 
     </property> 
     <property name="burnDownChartService"> 
      <ref local="burnDownChartService"/> 
     </property> 
     <property name="taskService"> 
      <ref local="taskService"/> 
     </property> 
    </bean> 
</beans> 

我複製所有的豆類表明沒有映射userstoryController。

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> 
    <filter> 
    <filter-name>characterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    </filter> 
    <filter-mapping> 
    <filter-name>characterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <servlet> 
    <servlet-name>scrumit</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/app-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>scrumit</servlet-name> 
    <url-pattern>/app/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

APP-config.xml中

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

    <!-- Scans the classpath of this application for @Components to deploy as beans --> 
    <context:component-scan base-package="ch.bsgroup.scrumit.controller" /> 

    <!-- Application Message Bundle --> 
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="basename" value="/WEB-INF/messages/messages" /> 
     <property name="cacheSeconds" value="0" /> 
    </bean> 

    <!-- Including beans --> 
    <import resource="beans.xml" /> 

    <!-- Configures Spring MVC --> 
    <import resource="mvc-config.xml" /> 

</beans> 

這就是我,當我啓動服務器:

INFO : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/userstory/{projectid}/{sprintid}/] onto handler 'userstoryController' 

的錯誤是:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler 'manageUserstoryController' to URL path [/userstory/{projectid}/{sprintid}/]: There is already handler of type [class ch.bsgroup.scrumit.controller.UserstoryController] mapped. 

由於userstoryController的存在,該程序不允許將UserstoryController映射到manageUserstoryController。

任何人都可以向我解釋爲什麼userstoryController生成,以及如何正確映射它。 在此先感謝。

+0

請出示你的web.xml。 –

+0

hi @SotiriosDelimanolis,我已經添加了web.xml文章。 – lightbringer

+0

你的app-config.xml和你的beans.xml是一樣的嗎? –

回答

14

問題如下。此元素

<context:component-scan base-package="ch.bsgroup.scrumit.controller" /> 

已經創建您的UserstoryController因爲@Controller控制器的一個實例。然後beans.xml中的<bean>元素創建另一個元素。

當您使用@Controller註解類並且具有合適的component-scan時,不應在您的上下文中聲明單獨的bean元素。

事實是,所有這一切都

<bean id="boardController" class="ch.bsgroup.scrumit.controller.BoardController"> 
    <property name="sprintService"> 
     <ref local="sprintService"/> 
    </property> 
    <property name="projectService"> 
     <ref local="projectService"/> 
    </property> 
    <property name="userStoryService"> 
     <ref local="userStoryService"/> 
    </property> 
    <property name="taskService"> 
     <ref local="taskService"/> 
    </property> 
    <property name="burnDownChartService"> 
     <ref local="burnDownChartService"/> 
    </property> 
</bean> 

可以在適當的領域註釋@Autowired被替換。你甚至不需要獲得者和安裝者。例如

@Controller 
@RequestMapping(value="userstory/{projectid}/{sprintid}/") 
@SessionAttributes(value = "user") 
public class UserstoryController { 
    @Autowired 
    private ISprintService sprintService; 

    @Autowired 
    private IUserStoryService userStoryService; 

    @Autowired 
    private IProjectService projectService; 

    @Autowired 
    private IBurnDownChartService burnDownChartService; 

    @Autowired 
    private ITaskService taskService; 

    @RequestMapping(method=RequestMethod.GET) 
    public String getUserstoryPage(@PathVariable("projectid") int pid, @PathVariable("sprintid") int sid, @ModelAttribute("user") SerializablePerson user) { 
     if (user.getId() != 0) { 
      Project p = this.projectService.findProjectById(pid); 
      if (p == null) { 
       throw new ResourceNotFoundException(pid); 
      } 
      if (user.getRole().equals("User")) { 
       return "userstory/user_userstory"; 
      } 
      else { 
       return "userstory/admin_userstory"; 
      } 
     } 
     return "redirect:../../../login"; 
    } 
} 

下面是一些相關的文檔:

+0

嗨, 非常感謝您的回答。我已經解決了這個問題。 – lightbringer

+0

@lightbringer不客氣。很高興我能幫上忙。 –

+0

我只是有一個關於Autowired的小問題: 如果我將Autowired添加到其他控制器,我不需要擁有beans.xml,這是否正確? – lightbringer