Ошибка Spring: вложенное исключение java .lang.IllegalArgumentException: имя класса не должно быть нулевым - PullRequest
0 голосов
/ 29 мая 2020

В настоящее время я работаю над проектом 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;
    }   


}

Сообщите мне, если вам нужна дополнительная информация, и спасибо за вашу поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...