无法自动装配包中的属性
Unable to autowire attributes in package
出于某种原因,在我的配置包中,我无法自动装配字段,而在我的控制器包中,似乎没有任何问题。
例如:
servlet-context.xml
<context:component-scan base-package="service, controller, config" />
root-context.xml(也尝试在此处添加服务)
<context:component-scan base-package="security" />
这不起作用:在配置包中设置 class。我收到空指针错误。
@Component
public class Setup { //inside the config package
@Autowired
private UserService userService; //null pointer error
/*..other stuff */
}
这确实有效:控制器包内的控制器:
@Controller
@RequestMapping(value="/contact")
public class ContactController { //inside the controller package
@Autowired
private UserService userService; //this works
/*..other stuff..*/
}
为什么它适用于控制器包而不适用于配置包?
尝试改用此配置:
<context:component-scan base-package="config,controller" />
发生这种情况可能是因为 @Service class UserService 在两个包中的任何一个中都不可见 "config" 或 "controller" 我假设您还需要对包含服务的包进行组件扫描:
<context:component-scan base-package="service" />
编辑:
通常你应该记住,如果 Bean/Component 不在扫描的上下文中,它将始终是 null 注入(自动装配)。
编辑 2:
所以你可能已经看到 Spring 有两种类型的上下文,ApplicationContext 和 ServletContext。如果你在 ServletContext 中扫描一个 bean,它只能从 Controllers 访问(或者从 servlets 的名称状态),但是扫描的 beans ApplicationContext 也可以从 Services 或其他 Components 访问,任何 servlet 都可以访问此处扫描的 beans,而无需在 servlet 上下文中扫描它们。
在您的情况下,您应该进行以下设置:
在servlet-context.xml:
<context:component-scan base-package="controller" />
In applicationContext.xml or root-context.xml (我假设你已经引用了它web.xml)
<context:component-scan base-package="config, security, services" />
下图说明了来自 Spring:
的上下文层次结构
出于某种原因,在我的配置包中,我无法自动装配字段,而在我的控制器包中,似乎没有任何问题。
例如:
servlet-context.xml
<context:component-scan base-package="service, controller, config" />
root-context.xml(也尝试在此处添加服务)
<context:component-scan base-package="security" />
这不起作用:在配置包中设置 class。我收到空指针错误。
@Component
public class Setup { //inside the config package
@Autowired
private UserService userService; //null pointer error
/*..other stuff */
}
这确实有效:控制器包内的控制器:
@Controller
@RequestMapping(value="/contact")
public class ContactController { //inside the controller package
@Autowired
private UserService userService; //this works
/*..other stuff..*/
}
为什么它适用于控制器包而不适用于配置包?
尝试改用此配置:
<context:component-scan base-package="config,controller" />
发生这种情况可能是因为 @Service class UserService 在两个包中的任何一个中都不可见 "config" 或 "controller" 我假设您还需要对包含服务的包进行组件扫描:
<context:component-scan base-package="service" />
编辑:
通常你应该记住,如果 Bean/Component 不在扫描的上下文中,它将始终是 null 注入(自动装配)。
编辑 2:
所以你可能已经看到 Spring 有两种类型的上下文,ApplicationContext 和 ServletContext。如果你在 ServletContext 中扫描一个 bean,它只能从 Controllers 访问(或者从 servlets 的名称状态),但是扫描的 beans ApplicationContext 也可以从 Services 或其他 Components 访问,任何 servlet 都可以访问此处扫描的 beans,而无需在 servlet 上下文中扫描它们。
在您的情况下,您应该进行以下设置:
在servlet-context.xml:
<context:component-scan base-package="controller" />
In applicationContext.xml or root-context.xml (我假设你已经引用了它web.xml)
<context:component-scan base-package="config, security, services" />
下图说明了来自 Spring:
的上下文层次结构