java - Spring mvc 向其他包隐藏一个包

标签 java spring spring-mvc spring-security component-scan

here is my project structure

正如图片所示,我的 ComponentScan 设置为整个项目。但不知何故,“config”包看不到任何其他包,反之亦然。

如果我运行我的项目,我会在启动时收到错误,没有可用的“com.rjproject.dao.UserDao”类型的合格 bean,并且对于此包中 Autowiring 的所有其他 bean 也是如此。但它们在所有其他包中都可以完美地 Autowiring 。

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 存在并且在任何其他包中都可以很好地 Autowiring 。

这里是 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

正如我所发现的,问题是当我想在配置中 Autowiring Spring bean 时,它还没有创建。但每个在线示例都表明它应该有效。

最佳答案

它不会隐藏。您只需为所有配置类设置 @ComponentScan 注释即可。每个配置类应该有自己的@ComponentScan

关于java - Spring mvc 向其他包隐藏一个包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54983941/

相关文章:

java - Spring 连接的 EhCache 磁盘存储在多线程应用程序中创建冲突

spring - 社交验证 : Invalid Scopes: read_stream

java - 如何在 Spring 中检查请求范围的可用性?

java - 哪一种更适合游戏开发? Jpanel还是jframe?

java - 具有返回列表的方法的通用接口(interface)

java - 如何从Spring服务访问私有(private)方法?

java - 从 spring mvc Controller 返回一个简单的映射结构到 ajax

spring-mvc - JavaConfig 中的 Spring Web Flow 转换服务

java - Android API 中的 HexDump 在哪里?

java - 我怎样才能使用util :list in spring configuration file