我有一个Spring控制器,根据我在调试代码时看到的对象ID,我认为它不止一次被实例化。
控制器:
@Controller
@RequestMapping("/services/user")
public class UserController{
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public UserService getUserService() {
return userService;
}
@RequestMapping(method = RequestMethod.POST, value = "/createUser")
public @ResponseBody String createUser(@RequestBody User user) throws UserNotCreatedException {
try {
userService.createUser(user);
return user.getEmail();
} catch (Exception e) {
e.printStackTrace();
throw new UserNotCreatedException("User not created");
}
}
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- Scans the classpath of this application for @Components to deploy as
beans -->
<context:component-scan base-package="com.xyz.controller" />
<context:annotation-config />
<bean id="userController" class="com.xyz.UserController">
<property name="userService" ref="userService" />
</bean>
<bean id="userService" class="com.xyz.UserServiceImpl">
<property name="userDao" ref="userDaoMysql" />
</bean>
<bean id="userDaoMysql" class="com.xyz.UserDaoImpl" >
<property name="dataSource" ref="dataSource"></property>
<property name="template" ref="jdbcTemplate"></property>
</bean>
</beans>
当我发出通过UserController的请求时,我意识到userService为null时,我注意到了这个问题。然而;当我提出断点时,我看到userService确实在另一个UserController实例中设置。
答案 0 :(得分:4)
此主题中的其他注释没有考虑UserController
类的包。提供的Spring配置初始化com.xyz.controller
上的组件扫描作为基础包。 UserController
类似乎在com.xyz
之外,因此不会被组件扫描拾取(除非这是一个错字@ user269091 - 这可能是你的问题!)。
我应该注意,我不明白为什么你的控制器不在你的controller
包中。将控制器移到那里,在行@Autowired
上方添加private UserService userService;
并删除Spring配置中的手动UserController
定义是最清晰的,这样组件扫描就会拿起你的bean自动并连接UserService
。
话虽如此,我真的不明白为什么你所展示的内容会出现问题。您的代码中的任何地方都有new UserController()
吗?还有其他Spring配置吗?
答案 1 :(得分:1)
建立@ adashr的答案
如果删除手动配置,那么您现在正在根据注释初始化内容。 @Controller注释将正确创建Controller,但现在UserService中没有任何连线
你需要一个@Autowired for UserService来实例化它,因为你的spring配置现在是注释驱动的
答案 2 :(得分:0)
您正在混合注释和bean xml配置。 如果您正在使用@Controller annotaion,则无需在XML中定义控制器bean。
指令
<context:component-scan base-package="com.xyz.controller" />
负责为您注册控制器bean(您的控制器bean在该包内)。
我建议您在配置Spring MVC时使用mvc命名空间,以保持配置最小化和可读性。