Spring mvc скрывает одну посылку от других - PullRequest
0 голосов
/ 04 марта 2019

here is my project structure

Как видно из рисунка, мой ComponentScan настроен на весь проект.Но каким-то образом пакет «config» не видит никакого другого пакета, и наоборот.

Если я запускаю свой проект, при запуске я получаю сообщение об ошибке: «Нет подходящего компонента типа com.rjproject.dao.UserDao».доступно, и то же самое для всех других компонентов, которые автоматически подключены в этом пакете.Но они автоматически прекрасно подключаются во всех других пакетах.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webSecurityConfig': Unsatisfied dependency expressed through field 'myUserDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.rjproject.service.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Но этот bean-компонент существует и автоматически подключается в любом другом пакете.

здесь webSecurityConfig

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    MyUserDetailsService myUserDetailsService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers("/admin/**")
                .access("hasRole('ADMIN')").and().formLogin()
                .loginPage("/login").failureUrl("/login?error")
                .usernameParameter("username")
                .passwordParameter("password")
                .and().logout().logoutSuccessUrl("/login?logout")
                .and().csrf()
                .and().exceptionHandling().accessDeniedPage("/403");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        return encoder;
    }
}

и здесьMyUserDetailService

@Service
public class MyUserDetailsService implements UserDetailsService {

@Autowired
private UserDao userDao;

@Transactional(readOnly=true)
@Override
public UserDetails loadUserByUsername(final String username)
        throws UsernameNotFoundException {

    com.rjproject.entities.User user = userDao.findByUserName(username);
    List<GrantedAuthority> authorities =
            buildUserAuthority(user.getAuthorities());

    return buildUserForAuthentication(user, authorities);

}

private User buildUserForAuthentication(com.rjproject.entities.User user,
                                        List<GrantedAuthority> authorities) {
    return new User(user.getUsername(), user.getPassword(),
            user.isEnabled(), true, true, true, authorities);
}

private List<GrantedAuthority> buildUserAuthority(Set<Authorities> userRoles) {

    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

    // Build user's authorities
    for (Authorities userRole : userRoles) {
        setAuths.add(new SimpleGrantedAuthority(userRole.getAuthority()));
    }

    List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);

    return Result;
}

}

UPD

Как я выяснил, проблема в том, что весенние бобы не создаются уже тогда, когда я хочуAutowire это в конфиге.Но каждый онлайн-пример говорит, что он должен работать.

1 Ответ

0 голосов
/ 12 марта 2019

Это не скрывает.Вам просто нужно установить аннотацию @ComponentScan для всех ваших классов конфигурации.Каждый класс конфигурации должен иметь свой собственный @ ComponentScan

...