原因:java.lang.AbstractMethodError:com.myapp.webapp.config.WebConfig$$EnhancerBySpringCGLIB$$b5f5a3c0.configureContentNegotiation
我有一个小项目,有原因:java.lang.AbstractMethodError:com.myapp.webapp.config.WebConfig$$EnhancerBySpringCGLIB$$b5f5a3c0.configureContentNegotiation,java,spring,maven,spring-mvc,spring-security,Java,Spring,Maven,Spring Mvc,Spring Security,我有一个小项目,有hibernate+jpa,Spring,springmvc(没有SpringBoot)。现在我正在尝试添加springsecurity UserDetailsServiceImpl.class: public class UserDetailsServiceImpl implements UserDetailsService { @Autowired Service<Account> accountService; @Override
hibernate
+jpa
,Spring
,springmvc
(没有SpringBoot
)。现在我正在尝试添加springsecurity
UserDetailsServiceImpl.class
:
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
Service<Account> accountService;
@Override
public UserDetails loadUserByUsername(String mail) throws UsernameNotFoundException {
Account account = new Account();
account.setMail(mail);
Account foundedAccount = accountService.readByObj(account);
if (foundedAccount == null) {
throw new UsernameNotFoundException("Account not found");
}
return new User(foundedAccount.getMail(), foundedAccount.getPassword()
, true, true, true, true,
Collections.singleton(new SimpleGrantedAuthority("ROLE_" + foundedAccount.getRole())));
}
}
@EnableWebSecurity
@Configuration
@ComponentScan({"com.myapp.webapp.config"})
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/account/**").hasRole("USER")
.and()
.formLogin()
.loginPage("/login").permitAll()
.loginProcessingUrl("/login")
.usernameParameter("mail")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
.invalidateHttpSession(true)
.deleteCookies("mail", "password", "id")
.and()
.rememberMe()
.rememberMeParameter("remember-me");
//.
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
}
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
}
@EnableWebMvc
@Configuration
@ComponentScan({"com.myapp.service.config",
"com.myapp.webapp"
} )
public class WebConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(AccountController.class);
@Autowired
EntityManagerFactory emf;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(accountInterceptor()).addPathPatterns("/account", "/editAccount", "/editSecurity", "/editMainInfo");
registry.addWebRequestInterceptor(entityManagerInViewInterceptor()).addPathPatterns("/*");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources ").addResourceLocations("/resources/");
registry.addResourceHandler("/WEB-INF/jsp ").addResourceLocations("/jsp/");
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver=new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
return resolver;
}
@Bean
public UserDetailsService userDetailsService() {
return new UserDetailsServiceImpl();
}
@Bean
public UserValidationInterceptor accountInterceptor() {
return new UserValidationInterceptor();
}
@Bean
public OpenEntityManagerInViewInterceptor entityManagerInViewInterceptor() {
OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor = new OpenEntityManagerInViewInterceptor();
openEntityManagerInViewInterceptor.setEntityManagerFactory(emf);
return openEntityManagerInViewInterceptor;
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
public class AppInit extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
WebConfig.class,
SecurityConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebConfig.class
};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SecurityWebApplicationInitializer.class
:
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
Service<Account> accountService;
@Override
public UserDetails loadUserByUsername(String mail) throws UsernameNotFoundException {
Account account = new Account();
account.setMail(mail);
Account foundedAccount = accountService.readByObj(account);
if (foundedAccount == null) {
throw new UsernameNotFoundException("Account not found");
}
return new User(foundedAccount.getMail(), foundedAccount.getPassword()
, true, true, true, true,
Collections.singleton(new SimpleGrantedAuthority("ROLE_" + foundedAccount.getRole())));
}
}
@EnableWebSecurity
@Configuration
@ComponentScan({"com.myapp.webapp.config"})
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/account/**").hasRole("USER")
.and()
.formLogin()
.loginPage("/login").permitAll()
.loginProcessingUrl("/login")
.usernameParameter("mail")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
.invalidateHttpSession(true)
.deleteCookies("mail", "password", "id")
.and()
.rememberMe()
.rememberMeParameter("remember-me");
//.
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
}
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
}
@EnableWebMvc
@Configuration
@ComponentScan({"com.myapp.service.config",
"com.myapp.webapp"
} )
public class WebConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(AccountController.class);
@Autowired
EntityManagerFactory emf;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(accountInterceptor()).addPathPatterns("/account", "/editAccount", "/editSecurity", "/editMainInfo");
registry.addWebRequestInterceptor(entityManagerInViewInterceptor()).addPathPatterns("/*");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources ").addResourceLocations("/resources/");
registry.addResourceHandler("/WEB-INF/jsp ").addResourceLocations("/jsp/");
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver=new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
return resolver;
}
@Bean
public UserDetailsService userDetailsService() {
return new UserDetailsServiceImpl();
}
@Bean
public UserValidationInterceptor accountInterceptor() {
return new UserValidationInterceptor();
}
@Bean
public OpenEntityManagerInViewInterceptor entityManagerInViewInterceptor() {
OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor = new OpenEntityManagerInViewInterceptor();
openEntityManagerInViewInterceptor.setEntityManagerFactory(emf);
return openEntityManagerInViewInterceptor;
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
public class AppInit extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
WebConfig.class,
SecurityConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebConfig.class
};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
WebConfig.class
:
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
Service<Account> accountService;
@Override
public UserDetails loadUserByUsername(String mail) throws UsernameNotFoundException {
Account account = new Account();
account.setMail(mail);
Account foundedAccount = accountService.readByObj(account);
if (foundedAccount == null) {
throw new UsernameNotFoundException("Account not found");
}
return new User(foundedAccount.getMail(), foundedAccount.getPassword()
, true, true, true, true,
Collections.singleton(new SimpleGrantedAuthority("ROLE_" + foundedAccount.getRole())));
}
}
@EnableWebSecurity
@Configuration
@ComponentScan({"com.myapp.webapp.config"})
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/account/**").hasRole("USER")
.and()
.formLogin()
.loginPage("/login").permitAll()
.loginProcessingUrl("/login")
.usernameParameter("mail")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
.invalidateHttpSession(true)
.deleteCookies("mail", "password", "id")
.and()
.rememberMe()
.rememberMeParameter("remember-me");
//.
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
}
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
}
@EnableWebMvc
@Configuration
@ComponentScan({"com.myapp.service.config",
"com.myapp.webapp"
} )
public class WebConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(AccountController.class);
@Autowired
EntityManagerFactory emf;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(accountInterceptor()).addPathPatterns("/account", "/editAccount", "/editSecurity", "/editMainInfo");
registry.addWebRequestInterceptor(entityManagerInViewInterceptor()).addPathPatterns("/*");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources ").addResourceLocations("/resources/");
registry.addResourceHandler("/WEB-INF/jsp ").addResourceLocations("/jsp/");
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver=new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
return resolver;
}
@Bean
public UserDetailsService userDetailsService() {
return new UserDetailsServiceImpl();
}
@Bean
public UserValidationInterceptor accountInterceptor() {
return new UserValidationInterceptor();
}
@Bean
public OpenEntityManagerInViewInterceptor entityManagerInViewInterceptor() {
OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor = new OpenEntityManagerInViewInterceptor();
openEntityManagerInViewInterceptor.setEntityManagerFactory(emf);
return openEntityManagerInViewInterceptor;
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
public class AppInit extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
WebConfig.class,
SecurityConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebConfig.class
};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
和AppInit.class
:
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
Service<Account> accountService;
@Override
public UserDetails loadUserByUsername(String mail) throws UsernameNotFoundException {
Account account = new Account();
account.setMail(mail);
Account foundedAccount = accountService.readByObj(account);
if (foundedAccount == null) {
throw new UsernameNotFoundException("Account not found");
}
return new User(foundedAccount.getMail(), foundedAccount.getPassword()
, true, true, true, true,
Collections.singleton(new SimpleGrantedAuthority("ROLE_" + foundedAccount.getRole())));
}
}
@EnableWebSecurity
@Configuration
@ComponentScan({"com.myapp.webapp.config"})
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/account/**").hasRole("USER")
.and()
.formLogin()
.loginPage("/login").permitAll()
.loginProcessingUrl("/login")
.usernameParameter("mail")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
.invalidateHttpSession(true)
.deleteCookies("mail", "password", "id")
.and()
.rememberMe()
.rememberMeParameter("remember-me");
//.
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
}
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
}
@EnableWebMvc
@Configuration
@ComponentScan({"com.myapp.service.config",
"com.myapp.webapp"
} )
public class WebConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(AccountController.class);
@Autowired
EntityManagerFactory emf;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(accountInterceptor()).addPathPatterns("/account", "/editAccount", "/editSecurity", "/editMainInfo");
registry.addWebRequestInterceptor(entityManagerInViewInterceptor()).addPathPatterns("/*");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources ").addResourceLocations("/resources/");
registry.addResourceHandler("/WEB-INF/jsp ").addResourceLocations("/jsp/");
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver=new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
return resolver;
}
@Bean
public UserDetailsService userDetailsService() {
return new UserDetailsServiceImpl();
}
@Bean
public UserValidationInterceptor accountInterceptor() {
return new UserValidationInterceptor();
}
@Bean
public OpenEntityManagerInViewInterceptor entityManagerInViewInterceptor() {
OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor = new OpenEntityManagerInViewInterceptor();
openEntityManagerInViewInterceptor.setEntityManagerFactory(emf);
return openEntityManagerInViewInterceptor;
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
public class AppInit extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
WebConfig.class,
SecurityConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebConfig.class
};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
1.在spring base项目中,最好将配置类导入WebConfig类,该类将扩展
WebMVCConfigureAdapter
或webmvcconfigurationsupport
2.在ServletInitializer类中,将webConfig类作为根就足够了
配置类
public class AppInit extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
WebConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
您是否尝试将SecurityConfig类导入WebConfig类?