В настоящее время я работаю над проектом Spring Security: веб-приложение с функциями регистрации и входа в систему.
Код, который будет приведен ниже, взят из курса Udemy, и я только изучаю его.
Код мне кажется правильным, но выдает подобное исключение.
(root cause)
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'demoSecurityConfig': Unsatisfied dependency
expressed through field 'userService'; nested exception is
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'userServiceImpl': Unsatisfied dependency expressed
through field 'userDao'; nested exception is
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'userDaoImpl': Unsatisfied dependency expressed
through field 'sessionFactory'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'sessionFactory' defined in
com.luv2code.springsecurity.demo.config.DemoAppConfig: Invocation of init
method failed; nested exception is java.lang.IllegalArgumentException:
Class name must not be null
Если вы посмотрите на сгенерированное исключение, оно будет иметь несколько вложенных исключений, пока не достигнет DemoAppConfig.class, так что похоже, что аннотации @Autowired мне подходят.
Мне кажется, что основная проблема этого исключения вызвана этим.
java.lang.IllegalArgumentException: Class name must not be null
Однако я не могу найти решение, чтобы исправить эту проблему. Я нашел сообщение, в котором говорится об этой проблеме, которое было написано в 2013 году. В нем говорится, что мне нужно импортировать эти зависимости
<dependencies>
<!-- ... other dependency elements ... -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.0.CI-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.0.CI-SNAPSHOT</version>
</dependency>
</dependencies>
<repositories>
<!-- ... possibly other repository elements ... -->
<repository>
<id>spring-snapshots</id>
<url>https://repo.springsource.org/snapshot</url>
</repository>
</repositories>
Однако это не работает.
Поскольку кажется, что основная причина проблемы находится в DemoAppConfig.class, я скопирую и вставлю только часть исходного кода проводных классов, чего достаточно, чтобы показать вам, как они связаны с каждым другие, кроме DemoAppConfig.class.
Вот код.
DemoSecurityConfig.class
@Configuration
@EnableWebSecurity
public class DemoSecurityConfig extends WebSecurityConfigurerAdapter {
//UserService는 UserDetailsService를 extends하는 interface이다.
@Autowired
private UserService userService;
UserService.class
public interface UserService extends UserDetailsService{
User findByUserName(String userName);
void save(CrmUser crmUser);
}
UserServiceImpl.class
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
UserDao.class
public interface UserDao {
User findByUserName(String userName);
void save(User user);
}
UserDaoImpl.class
@Repository
public class UserDaoImpl implements UserDao {
// need to inject the session factory
@Autowired
private SessionFactory sessionFactory;
DemoAppConfig.class
@Configuration
@EnableWebMvc
@ComponentScan(basePackages="com.luv2code.springsecurity.demo")
@PropertySource("classpath:persistence-oracle.properties")
public class DemoAppConfig {
@Autowired
private Environment env;
private Logger logger = Logger.getLogger(getClass().getName());
// define a bean for ViewResolver
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public DataSource securityDataSource() {
ComboPooledDataSource securityDataSource
= new ComboPooledDataSource();
try {
securityDataSource.setDriverClass(env.getProperty("jdbc.driver"));
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
logger.info(">>> jdbc.url=" + env.getProperty("jdbc.url"));
logger.info(">>> jdbc.user=" + env.getProperty("jdbc.user"));
securityDataSource.setJdbcUrl(env.getProperty("jdbc.url"));
securityDataSource.setUser(env.getProperty("jdbc.user"));
securityDataSource.setPassword(env.getProperty("jdbc.password"));
securityDataSource.setInitialPoolSize(getIntProperty("connection.pool.initialPoolSize"));
securityDataSource.setMinPoolSize(getIntProperty("connection.pool.minPoolSize"));
securityDataSource.setMaxPoolSize(getIntProperty("connection.pool.maxPoolSize"));
securityDataSource.setMaxIdleTime(getIntProperty("connection.pool.maxIdleTime"));
return securityDataSource;
}
private int getIntProperty(String propName) {
String propVal = env.getProperty(propName);
int intPropVal = Integer.parseInt(propVal);
return intPropVal;
}
private Properties getHibernateProperties() {
// set hibernate properties
Properties props = new Properties();
props.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
props.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
return props;
}
@Bean
public LocalSessionFactoryBean sessionFactory(){
// create session factories
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
// set the properties
sessionFactory.setDataSource(securityDataSource());
sessionFactory.setPackagesToScan(env.getProperty("hiberante.packagesToScan"));
sessionFactory.setHibernateProperties(getHibernateProperties());
return sessionFactory;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
// setup transaction manager based on session factory
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
}
Сообщите мне, если вам нужна дополнительная информация, и спасибо за вашу поддержку.