[英]Spring mvc controller bean configuration
I am working on a project using Spring mvc and I counter a problem that a handler is auto generated when I start the server. 我正在使用Spring mvc开发一个项目,我解决了启动服务器时自动生成处理程序的问题。
Here is the code: 这是代码:
Controller 调节器
@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 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>
I copy all the beans to show that there is no userstoryController mapped. 我复制所有bean以显示没有userstoryController映射。
web.xml 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 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>
And this is what I have when I start the server: 这就是我启动服务器时的情况:
INFO : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/userstory/{projectid}/{sprintid}/] onto handler 'userstoryController'
The error is: 错误是:
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.
The program does not allow me to map UserstoryController to manageUserstoryController because of the existence of userstoryController. 由于userstoryController的存在,该程序不允许我将UserstoryController映射到manageUserstoryController。
Could anyone explain to me why userstoryController is generated, and how to map it properly. 任何人都可以向我解释为什么生成userstoryController,以及如何正确映射它。 Thanks in advance.
提前致谢。
The issue is the following. 问题如下。 This element
这个元素
<context:component-scan base-package="ch.bsgroup.scrumit.controller" />
already creates an instance of your UserstoryController
controller because of @Controller
. 因为
@Controller
已经创建了UserstoryController
控制器的实例。 And then the <bean>
elements in beans.xml
creates another one. 然后
beans.xml
的<bean>
元素创建另一个元素。
When you annotate a class with @Controller
and have an appropriate component-scan
, you should not declare a separate bean
element in your context. 使用
@Controller
注释类并进行适当的component-scan
,不应在上下文中声明单独的bean
元素。
The fact is, all of this 事实是,所有这一切
<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>
can be replaced with appropriate @Autowired
annotations on fields. 可以用字段上相应的
@Autowired
注释替换。 You don't even need getters and setters. 你甚至不需要getter和setter。 For example
例如
@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";
}
}
Here's some related documentation: 这是一些相关的文档:
<context:component-scan>
and <annotation-driven />
tags? <context:component-scan>
和<annotation-driven />
标签之间的区别? <context:annotation-config>
vs <context:component-scan>
<context:annotation-config>
与<context:component-scan>
之间的区别
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.