Я новичок в Spring, и я пытаюсь создать приложение для обучения, но у меня возникают проблемы с Autowiring, я добавляю свой код. Я работаю над весенним ботинком.
логинконтроллер:
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;
}
}
UserService:
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);
}
}
файл конфигурации Spring bean:
<?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>
Создан конструктор контроллера и автоматически подключен, как указано в приведенном выше коде;
Ниже я получаю сообщение об ошибке:
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?
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor.java:569) org.springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.java:88) org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues (AutowiredAnnotationBeanPostProcessor.java:349) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1214) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:543) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:482) org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:306) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:302) org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:776) org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:861) org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:541) org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext (FrameworkServlet.java:668) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.java:634) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.java:682) org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext (FrameworkServlet.java:553) org.springframework.web.servlet.FrameworkServlet.initServletBean (FrameworkServlet.java:494) org.springframework.web.servlet.HttpServletBean.init (HttpServletBean.java:136) javax.servlet.GenericServlet.init (GenericServlet.java:160) org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:100) org.apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.java:953) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:408) org.apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.java:1041) org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.java:603) org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run (JIoEndpoint.java:312) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) java.lang.Thread.run (Thread.java:748)




Ваш bean-компонент jdbcTemplate ожидает bean-компонент с именем datasource, как вы установили здесь (в части ref=...:
<bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
<property name = "dataSource" ref = "datasource" />
</bean>
Но вашего bean-компонента datasource не существует. Причина в том, что вы определили его как dataSource (обратите внимание на заглавную букву "S") в bean id = "dataSource".
<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>
Так что измените это на "источник данных", например bean id = "datasource" или измените ссылку в вашем jdbcTemplate на ref = "dataSource"
Также <property name = "url" value = ";DatabaseName = " /> выглядит некорректно, я думаю, вы пропустили правильный value здесь, ";DatabaseName = " выглядит неправильно или неполным.
ОБНОВИТЬ
Поскольку вы используете конфигурацию xml spring, аннотация @Autowired в ваших классах UserDaoImpl и UserServiceImpl не нужна. Однако конфигурация xml требует наличия эквивалентных геттеров / сеттеров. Так что измените свой код как:
В вашем UserDaoImpl вам вообще не нужен компонент dataSource, поэтому мы его удаляем.
public class UserDaoImpl implements UserDao{
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;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
Однако вам нужен bean-компонент jdbcTemplate, и в вашем определении xml вы его не устанавливаете, поэтому обновите также свой весенний xml-файл, чтобы:
<bean name = "userDao" class = "com.cloudnexus.spring.dao.UserDaoImpl">
<property name = "jdbcTemplate" ref = "jdbcTemplate"></property>
</bean>
и
public class UserServiceImpl implements UserService{
private UserDao userDao;
public User validateUser(Login login) {
return userDao.validateUser(login);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
Также у вас есть еще одна ошибка в файле конфигурации spring xml. В определении bean-компонента userService вы снова устанавливаете его как свойство:
<property name = "userService" ref = "userService"></property>
Это неправильно, вы должны установить туда userDao. Обновите его как:
<bean id = "userService" class = "com.cloudnexus.spring.service.UserServiceImpl">
<property name = "userDao" ref = "userDao"></property>
</bean>
Я снова изменил идентификатор bean-компонента as = "datasource". Я получаю сообщение об ошибке при создании bean-компонента userservice.
...который? Пожалуйста, опубликуйте ошибку stacktrace. Вы исправили <property name = "url" value = ";DatabaseName = " />?
При вводе значения URL была ошибка, я опубликовал сообщение об ошибке, пожалуйста, проверьте и помогите мне
Если вы, как и вы, используете конфигурацию xml, вам не следует использовать аннотации, такие как @Autowired, это уже сделано в файле конфигурации spring. Однако вы должны создавать геттеры и сеттеры для своих свойств, я обновлю свой ответ, чтобы показать вам
Скажите, пожалуйста, как вы переименовали bean-компонент источника данных? с "S" или "s"? Это имеет значение для геттеров / сеттеров.
я изменил ссылку как = "dataSource"
Небольшой совет - выбрать либо конфигурацию spring xml, либо конфигурацию java с аннотациями. Использование обоих сбивает с толку.
пожалуйста, помогите мне, я не могу найти ошибку там, где я сделал не так