java组织。springframework。豆。工厂UnsatifiedPendencyException:创建名为“loginController”的bean时出错
我是Spring的新手,我正在尝试制作一个学习应用程序,但我在自动布线方面遇到了问题,我正在添加代码。我正在做弹簧靴
登录控制器:
package com.cloudnexus.spring.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.cloudnexus.spring.model.Login;
import com.cloudnexus.spring.model.User;
import com.cloudnexus.spring.service.UserService;
@Controller
public class LoginController {
@Autowired
UserService userService;
@RequestMapping(value = "/loginProcess", method = RequestMethod.POST)
public ModelAndView loginProcess(HttpServletRequest request, HttpServletResponse response,
@ModelAttribute("login") Login login) {
ModelAndView mav = null;
User user = userService.validateUser(login);
if (null != user) {
mav = new ModelAndView("welcome");
mav.addObject("firstname", user.getUsername());
} else {
mav = new ModelAndView("login");
mav.addObject("message", "Username or Password is wrong!!");
}
return mav;
}
}
////
登录POJO:
package com.cloudnexus.spring.model;
public class Login {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
用户Pojo:
package com.cloudnexus.spring.model;
public class User {
private String username;
private String password;
private int IsActive;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getIsActive() {
return IsActive;
}
public void setIsActive(int isActive) {
IsActive = isActive;
}
}
UserDao:
package com.cloudnexus.spring.dao;
import com.cloudnexus.spring.model.Login;
import com.cloudnexus.spring.model.User;
public interface UserDao {
User validateUser(Login login);
}
UserDaoImpl
package com.cloudnexus.spring.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import com.cloudnexus.spring.model.Login;
import com.cloudnexus.spring.model.User;
public class UserDaoImpl implements UserDao{
@Autowired
DataSource datasource;
@Autowired
JdbcTemplate jdbcTemplate;
public User validateUser(Login login) {
String sql = "select * from users where username='" + login.getUsername() + "' and password='" + login.getPassword()
+ "'";
List<User> users = jdbcTemplate.query(sql, new UserMapper());
return users.size() > 0 ? users.get(0) : null;
}
}
class UserMapper implements RowMapper<User> {
public User mapRow(ResultSet rs, int arg1) throws SQLException {
User user = new User();
user.setUsername(rs.getString("Name"));
user.setPassword(rs.getString("Password"));
user.setIsActive(rs.getInt("IsActive"));
return user;
}
}
用户服务:
package com.cloudnexus.spring.service;
import com.cloudnexus.spring.model.Login;
import com.cloudnexus.spring.model.User;
public interface UserService {
User validateUser(Login login);
}
UserServiceImpl
package com.cloudnexus.spring.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.cloudnexus.spring.dao.UserDao;
import com.cloudnexus.spring.model.Login;
import com.cloudnexus.spring.model.User;
public class UserServiceImpl implements UserService{
@Autowired
public UserDao userDao;
public User validateUser(Login login) {
return userDao.validateUser(login);
}
}
Springbean配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<context:component-scan base-package="com.cloudnexus.spring" />
<context:annotation-config />
<bean id="userService" class="com.cloudnexus.spring.service.UserServiceImpl">
<property name="userService" ref="userService"></property>
</bean>
<bean name="userDao" class="com.cloudnexus.spring.dao.UserDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url" value=";DatabaseName=" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
</beans>
- @自动连接到LoginBean LoginBean李>
- 在控制器类和自动连线设置器中创建LoginBean的getter设置器李>
创建控制器和自动连线的构造函数,如上述代码所示
下面是我遇到的错误:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginController': Unsatisfied dependency expressed through field 'userService': Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userDao': Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userDao': Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
组织。springframework。豆。工厂注释。AutoWiredNotationBeanPostProcessor$AutoWiredFeldElement。注入(AutoWiredNotationBeanpostProcessor.java:569) 组织。springframework。豆。工厂注释。注入元数据。inject(InjectionMetadata.java:88) 组织。springframework。豆。工厂注释。AutoWiredNotationBeanPostProcessor。后处理属性值(AutoWiredNotationBeanpostProcessor.java:349) 组织。springframework。豆。工厂支持AbstractAutoWireAbleBeanFactory。populateBean(AbstractAutowireCapableBeanFactory.java:1214) 组织。springframework。豆。工厂支持AbstractAutoWireAbleBeanFactory。doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 组织。springframework。豆。工厂支持AbstractAutoWireAbleBeanFactory。createBean(AbstractAutowireCapableBeanFactory.java:482) 组织。springframework。豆。工厂支持AbstractBeanFactory 1美元。getObject(AbstractBeanFactory.java:306) 组织。springframework。豆。工厂支持DefaultSingletonBeanRegistry。getSingleton(DefaultSingletonBeanRegistry.java:230) 组织。springframework。豆。工厂支持抽象工厂。doGetBean(AbstractBeanFactory.java:302) 组织。springframework。豆。工厂支持抽象工厂。getBean(AbstractBeanFactory.java:197) 组织。springframework。豆。工厂支持DefaultListableBeanFactory。预实例化单例(DefaultListableBeanFactory.java:776) 组织。springframework。上下文支持AbstractApplicationContext。finishBeanFactoryInitialization(AbstractApplicationContext.java:861) 组织。springframework。上下文支持AbstractApplicationContext。刷新(AbstractApplicationContext.java:541) 组织。springframework。网状物servlet。FrameworkServlet。configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) 组织。springframework。网状物servlet。FrameworkServlet。createWebApplicationContext(FrameworkServlet.java:634) 组织。springframework。网状物servlet。FrameworkServlet。createWebApplicationContext(FrameworkServlet.java:682) 组织。springframework。网状物servlet。FrameworkServlet。initWebApplicationContext(FrameworkServlet.java:553) 组织。springframework。网状物servlet。FrameworkServlet。initServletBean(FrameworkServlet.java:494) 组织。springframework。网状物servlet。HttpServletBean。init(HttpServletBean.java:136) javax。servlet。通用服务。init(GenericServlet.java:160) 组织。阿帕奇。卡塔琳娜。验证者。AuthenticatorBase。调用(AuthenticatorBase.java:502) 组织。阿帕奇。卡塔琳娜。阀门。打开阀门。调用(ErrorReportValve.java:100) 组织。阿帕奇。卡塔琳娜。阀门。检修阀。调用(AccessLogValve.java:953) 组织。阿帕奇。卡塔琳娜。连接器。郊狼适应者。服务(CoyoteAdapter.java:408) 组织。阿帕奇。郊狼。http11。抽象Http11处理器。进程(AbstractHttp11Processor.java:1041) 组织。阿帕奇。郊狼。AbstractProtocol$AbstractConnectionHandler。流程(AbstractProtocol.java:603) 组织。阿帕奇。公猫util。网JIoEndpoint$SocketProcessor。run(JIoEndpoint.java:312) JAVAutil。同时发生的线程池执行器。runWorker(ThreadPoolExecutor.java:1149) JAVAutil。同时发生的ThreadPoolExecutor$Worker。run(ThreadPoolExecutor.java:624) JAVA朗。丝线。运行(Thread.java:748)
# 1 楼答案
你的
jdbcTemplate
bean需要一个名为datasource
的bean,就像你在这里设置的那样(在ref=...
部分:但是你的
datasource
bean不存在。原因是您在bean id="dataSource"
中将其定义为dataSource
(注意大写字母“S”)因此,将其更改为“数据源”,例如,
bean id="datasource"
或将jdbcTemplate
中的引用更改为ref="dataSource"
而且
<property name="url" value=";DatabaseName=" />
看起来不正确,我想你错过了正确的value
在这里,";DatabaseName="
看起来错误或不完整更新
因为您使用的是xml spring配置,所以
UserDaoImpl
和UserServiceImpl
类中的@Autowired
注释是不必要的。然而,xml配置要求存在等效的getter/setter。因此,将代码更改为:在
UserDaoImpl
中,您根本不需要dataSource
bean,因此我们正在删除它但是,您确实需要
jdbcTemplate
bean,并且在xml定义中没有设置它,所以也要将spring xml文件更新为:及
此外,spring xml配置文件中还有另一个错误。在
userService
bean定义中,您再次将其设置为属性:<property name="userService" ref="userService"></property>
这是错误的,您应该在那里设置
userDao
。更新为: