Java 自连线依赖项的注入
我知道有几个类似的问题,但我仍然无法理解为什么我的示例不起作用 我有一个Spring MVC项目,其中我有一个控制器:Java 自连线依赖项的注入,java,spring,spring-mvc,Java,Spring,Spring Mvc,我知道有几个类似的问题,但我仍然无法理解为什么我的示例不起作用 我有一个Spring MVC项目,其中我有一个控制器: @Controller public class StudentController { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; private static Logger log = Logger.getLog
@Controller
public class StudentController {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
private static Logger log = Logger.getLogger(StudentController.class);
@Autowired
@Qualifier("studentsManager")
IStudentsManager studentsManager;
@Autowired
@Qualifier("departmentsManager")
IDepartmentsManager departmentsManager;
...
StudentsManager类:
@Transactional
@Repository
public class StudentsManager extends JdbcDaoSupport implements IStudentsManager {
@Autowired
@Qualifier("departmentsManager")
private IDepartmentsManager departmentsManager;
...
@Transactional
@Repository
public class DepartmentsManager extends JdbcDaoSupport implements
IDepartmentsManager {
/** The log. */
private static Log log = LogFactory.getLog(DepartmentsManager.class);
/** The departments. */
private List<Department> departments = new ArrayList<Department>();
public void addDepartment(int id, String name) {
Department d = new Department(id, name);
departments.add(d);
}
public void addDepartment(Department department)
throws FileNotFoundException {
if (log.isDebugEnabled()) {
log.debug("Entered to add department method ");
}
departments.add(department);
StringBuilder sb = new StringBuilder();
sb.append(department.toString()).append(" added");
log.info(sb.toString());
this.serialize();
}
public Department getDepartment(int departmentId) {
if (log.isDebugEnabled()) {
log.debug("Entered to getDepartment");
}
for (Department d : departments) {
if (departmentId == d.getDepartmentId()) {
return d;
}
}
return null;
}
public Collection<Department> getAllDepartments() throws SQLException,
ClassNotFoundException {
if (log.isDebugEnabled()) {
log.debug("Entered to getAllDepartments");
}
departments.clear();
Class.forName("com.mysql.jdbc.Driver");
String sql = "SELECT id, name FROM departments ORDER BY id";
RowMapper<Department> rm = ParameterizedBeanPropertyRowMapper
.newInstance(Department.class);
return getJdbcTemplate().query(sql, rm);
}
public void serialize() throws FileNotFoundException {
XStream xstream = new XStream();
xstream.alias("departments", List.class);
System.out.println(xstream.toXML(departments));
FileOutputStream fos = new FileOutputStream("departments.xml", true);
xstream.toXML(departments, fos);
}
public void deserialize() throws FileNotFoundException {
XStream xstream = new XStream();
xstream.alias("departments", List.class);
departments = (List<Department>) xstream.fromXML(new FileInputStream(
"departments.xml"));
}
}
DepartmentsManager类:
@Transactional
@Repository
public class StudentsManager extends JdbcDaoSupport implements IStudentsManager {
@Autowired
@Qualifier("departmentsManager")
private IDepartmentsManager departmentsManager;
...
@Transactional
@Repository
public class DepartmentsManager extends JdbcDaoSupport implements
IDepartmentsManager {
/** The log. */
private static Log log = LogFactory.getLog(DepartmentsManager.class);
/** The departments. */
private List<Department> departments = new ArrayList<Department>();
public void addDepartment(int id, String name) {
Department d = new Department(id, name);
departments.add(d);
}
public void addDepartment(Department department)
throws FileNotFoundException {
if (log.isDebugEnabled()) {
log.debug("Entered to add department method ");
}
departments.add(department);
StringBuilder sb = new StringBuilder();
sb.append(department.toString()).append(" added");
log.info(sb.toString());
this.serialize();
}
public Department getDepartment(int departmentId) {
if (log.isDebugEnabled()) {
log.debug("Entered to getDepartment");
}
for (Department d : departments) {
if (departmentId == d.getDepartmentId()) {
return d;
}
}
return null;
}
public Collection<Department> getAllDepartments() throws SQLException,
ClassNotFoundException {
if (log.isDebugEnabled()) {
log.debug("Entered to getAllDepartments");
}
departments.clear();
Class.forName("com.mysql.jdbc.Driver");
String sql = "SELECT id, name FROM departments ORDER BY id";
RowMapper<Department> rm = ParameterizedBeanPropertyRowMapper
.newInstance(Department.class);
return getJdbcTemplate().query(sql, rm);
}
public void serialize() throws FileNotFoundException {
XStream xstream = new XStream();
xstream.alias("departments", List.class);
System.out.println(xstream.toXML(departments));
FileOutputStream fos = new FileOutputStream("departments.xml", true);
xstream.toXML(departments, fos);
}
public void deserialize() throws FileNotFoundException {
XStream xstream = new XStream();
xstream.alias("departments", List.class);
departments = (List<Department>) xstream.fromXML(new FileInputStream(
"departments.xml"));
}
}
我总是在没有资格赛的情况下做这件事,而且总是很有效,但这次不行。所以我添加了这个注释,但仍然不起作用
看起来组件扫描不起作用,但我试着对它做一些修改,结果是一样的,所以我猜问题与它无关
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/root-context.xml,
/WEB-INF/spring/security.xml
</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>students</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>students</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
<filter>
<filter-name>charsetEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>charsetEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
上下文配置位置
/WEB-INF/spring/root-context.xml,
/WEB-INF/spring/security.xml
org.springframework.web.context.ContextLoaderListener
学生
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
/WEB-INF/spring/appServlet/servlet-context.xml
1.
学生
/
/
字符编码过滤器
org.springframework.web.filter.CharacterEncodingFilter
编码
UTF-8
字符编码过滤器
/*
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
您需要根据这些类的功能,使用@Component、@Repository或@Service为StudentsManager
和DepartmentsManager
添加注释
还要确保它们属于您在春季扫描的软件包。您的Manager类上是否有
@Repository
注释?如果不添加它,请尝试aggain。我已经添加了@Repository注释,但仍然是pagackeamg.net.controller
或“amg.net.services”中的类。您的bean是在应用程序上下文xml中声明的,因此应该可以找到它们。看起来您的xml处理不正确或级别不正确。它是如何在web.xml
文件中声明的?root context.xml看起来像什么?好的,它解决了一点问题,但我仍然有:创建名为'departmentsManager'的bean时出错:调用init方法失败;嵌套的异常是java.lang.IllegalArgumentException:“需要数据源”或“jdbcTemplate”需要查看DepartmentsManager类这两个bean是用xml声明的,应该已经找到了。我已经编辑了我的帖子并添加了Departments Manager的完整实现我认为在中自动连接Departments Manager存在问题学生经理。我在那里添加了@qualifier注释,但没有帮助。