1

我有一个 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");

    }
}

弹簧配置文件:

  <?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 为空时,我注意到了这个问题。然而; 当我设置断点时,我看到 userService 确实设置在 UserController 的另一个实例中。

4

3 回答 3

4

该线程中的其他评论没有考虑到UserController类的包。提供的 Spring 配置将组件扫描初始化com.xyz.controller为基础包。该类UserController看起来不在此范围内com.xyz,因此不会被组件扫描拾取(除非这是一个错字@user269091 - 这可能是您的问题!)。

我应该注意,我不明白为什么你的控制器不会在你的controller包中。将控制器移到那里是最干净的,@Autowired在该行上方添加private UserService userService;并删除 Spring 配置中的手动UserController定义,以便组件扫描自动拾取您的 bean 并连接UserService.

话虽如此,我真的不明白为什么你所展示的会有问题。new UserController()你的代码中有任何地方吗?还有其他的Spring配置吗?

于 2013-09-18T04:29:01.950 回答
1

以@adashr 的回答为基础

如果您删除手动配置,那么您现在正在根据注释初始化事物。@Controller 注释将正确创建控制器,但现在 UserService 中没有任何连接

您需要一个 @Autowired 供 UserService 实例化它,因为您的 spring 配置现在是注释驱动的

于 2013-09-17T21:15:24.750 回答
0

您正在混合注释和 bean xml 配置。如果您使用@Controller 注解,则不需要在 XML 中定义控制器 bean。

该指令

<context:component-scan base-package="com.xyz.controller" />

负责为您注册控制器 bean(您的控制器 bean 在该包中)。

我建议您在配置 Spring MVC 时使用 mvc 命名空间,以保持配置最少且更具可读性。

于 2013-09-18T04:37:07.613 回答