- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
您好,我有一个关于 Autowired UsrDetailsService 的问题,我发现很多其他人也有同样的问题,但没有其他解决方案适合我(我不知道为什么)我使用 java 配置(没有 xml)
Error code
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'securityConfig':
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field: private com.mycompany.delivery.service.AccountServiceImpl com.mycompany.delivery.config.SecurityConfig.accUserDetailsService;
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [com.mycompany.delivery.service.AccountServiceImpl] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=accUserDetailsService)}
当我将此类 Autowiring 到 Controller 或其他任何它工作正常的地方时,其他一切都可以正常 Autowiring 到 WebSecurityConfigurerAdapter 我不能。
我的安全配置:
Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("accUserDetailsService")
private AccountServiceImpl accUserDetailsService;
public AccountServiceImpl getAccUserDetailsService() {
return accUserDetailsService;
}
public void setAccUserDetailsService(AccountServiceImpl accUserDetailsService) {
this.accUserDetailsService = accUserDetailsService;
}
// @Override
// protected void configure(AuthenticationManagerBuilder registry) throws Exception {
// registry.userDetailsService(accUserDetailsService);
//}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("mkyong").password("123456").roles("USER");
auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
auth.inMemoryAuthentication().withUser("dba").password("123456").roles("DBA");
}
//.csrf() is optional, enabled by default, if using WebSecurityConfigurerAdapter constructor
@Bean(name = "myAuthenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/admin/**").access("hasRole('ROLE_USER')")
.antMatchers("/admin/partlyVisible/**").access("hasAnyRole('ROLE_USER', 'ROLE_ADMIN')").and()
.formLogin().loginPage("/admin/login").failureUrl("/admin/login?error")
.usernameParameter("username").passwordParameter("password")
.and()
.logout().logoutSuccessUrl("/admin/login?logout").and()
.exceptionHandling().accessDeniedPage("/admin/403")
.and()
.csrf();
}
}
我的 WebMvcConfigurerAdapter
@Configuration
@EnableWebMvc
@Import({ SecurityConfig.class })
@ComponentScan(basePackages = "com.mycompany.*")
@ImportResource({"classpath:applicationContext.xml"})
@EnableTransactionManagement
public class MySpringMvcConfig extends WebMvcConfigurerAdapter {
final static Logger log = LoggerFactory.getLogger(MySpringMvcConfig.class);
/**
* Maps the main page to a specific view.
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
log.debug("mapping URL / to home view");
registry.addViewController("/").setViewName("home");
registry.addViewController("/snoop").setViewName("snoop");
}
/**
* Enables default Tomcat servlet that serves static files.
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
log.debug("enabling default servlet for static files");
configurer.enable();
}
/**
* Provides mapping from view names to JSP pages in WEB-INF/jsp directory.
*/
@Bean
public ViewResolver viewResolver() {
log.debug("registering JSP in /WEB-INF/jsp/ as views");
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
/**
* Provides localized messages.
*/
@Bean
public MessageSource messageSource() {
log.debug("registering ResourceBundle 'Texts' for messages");
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("Texts");
return messageSource;
}
/**
* Provides JSR-303 Validator.
*/
@Bean
public Validator validator() {
log.debug("validator()");
return new LocalValidatorFactoryBean();
}
}
AbstractAnnotationConfigDispatcherServletInitializer
public class MyStartInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
private Object sc;
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//create Spring beans context configured in MySpringMvcConfig.class
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(MySpringMvcConfig.class);
ctx.register(SecurityConfig.class);
//register Spring MVC main Dispatcher servlet
ServletRegistration.Dynamic disp = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
disp.setLoadOnStartup(1);
disp.addMapping("/");
//register filter setting utf-8 encoding on all requests
FilterRegistration.Dynamic encoding = servletContext.addFilter("encoding", CharacterEncodingFilter.class);
encoding.setInitParameter("encoding", "utf-8");
encoding.addMappingForUrlPatterns(null, false, "/*");
//register bundle also for JSTL fmt: tags which are not behind DispatcherServlet
servletContext.setInitParameter(Config.FMT_LOCALIZATION_CONTEXT, "Texts");
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { MySpringMvcConfig.class, SecurityConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
AbstractSecurityWebApplicationInitializer
public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
public SpringSecurityInitializer() {
super(SecurityConfig.class);
}
}
最后是我的 UserDetailsService
@Service(value = "accUserDetailsService")
public class AccountServiceImpl implements UserDetailsService {
@Autowired
private AccountDAO accountDao;
public AccountDAO getAccountDao() {
return accountDao;
}
public void setAccountDao(AccountDAO accountDao) {
this.accountDao = accountDao;
}
@Override
public UserDetails loadUserByUsername(String string) throws UsernameNotFoundException {
UserDetails userDetails = null;
Account account = accountDao.getByLogin(string);
if (account == null) {
throw new UsernameNotFoundException("Account not found.");
}
userDetails = new AccountAdapter(account);
return userDetails;
}
}
感谢帮助
最佳答案
又过了一个小时,我让它工作了(但不确定如何/为什么)
我的安全配置:
@Configuration
@EnableWebSecurity
改为
@Configuration
@EnableWebMvcSecurity
@ImportResource({"classpath:applicationContext.xml"})
@EnableGlobalMethodSecurity
ImportResource 很重要,但现在我有两次 importrecource,第一次在这里第二次在 WebMvcConfigurerAdapter
关于java - 无法将 UserDetailsService Autowiring 到 WebSecurityConfigurerAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28056501/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!