springboot踩坑篇-01
springboot踩坑篇-01–@EnableWebMvc注解和@EnableAutoConfiguration 注解
问题出现
最近项目在用springboot开发,项目当中要用到spring的拦截器;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.jcl.gycms.entity.LoginLogs;
import com.jcl.gycms.service.LoginLogsService;
/**
-
@author zpf
-
@version 1.0
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {@Autowired
private LoginLogsService loginLogsService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
String username = (String) request.getSession().getAttribute(“isLogin”);
if(StringUtils.isNotBlank(username)) {
LoginLogs loginLogs = new LoginLogs();
loginLogs.setLoginname(username);
loginLogs.setLogintime(new Date());
String localAddr = request.getLocalAddr();
String ip = request.getRemoteAddr();
System.out.println("–localAddr"+localAddr+"----ip"+ip);
loginLogs.setLoginip(request.getLocalAddr());
int i = loginLogsService.saveSelective(loginLogs);
if(i>0) {
System.out.println(“记录登录日志-----成功”);
}
}
}
}
在配置拦截器时用到了@EnableWebMvc
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
-
@author zpf
-
@version 1.0
*/
@EnableWebMvc
@Configuration
public class LoginConfiguration extends WebMvcConfigurerAdapter{@Bean
LoginInterceptor localInterceptor() {
System.out.println(“将拦截器注册成bean”);
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println(“拦截登录了-------------------”);
// 注册拦截器
LoginInterceptor loginInterceptor = new LoginInterceptor();
InterceptorRegistration loginRegistry = registry.addInterceptor(loginInterceptor);
// 拦截路径
loginRegistry.excludePathPatterns("/WEB-INF/jsp");
loginRegistry.addPathPatterns("/adminLogin/**");}
}
然后项目可以正常启动,但是当我访问项目是
查看后台发现报错Could not resolve view with name ‘index’ in servlet with name ‘dispatcherServlet’–路径映射不到,但是也没想到问题所在,于是只能问万能的度娘了
问题解决
参考了https://blog.youkuaiyun.com/testcs_dn/article/details/80249894微wx笑的博客发现是@EnableWebMvc这个注解的问题
使用 @EnableWebMvc 注解,需要以编程的方式指定视图文件相关配置;
使用 @EnableAutoConfiguration 注解,会读取 application.properties 或 application.yml 文件中的配置。
解决1
换成@EnableAutoConfiguration
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
-
@author zpf
-
@version 1.0
*/
@EnableAutoConfiguration
@Configuration
public class LoginConfiguration extends WebMvcConfigurerAdapter{@Bean
LoginInterceptor localInterceptor() {
System.out.println(“将拦截器注册成bean”);
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println(“拦截登录了-------------------”);
// 注册拦截器
LoginInterceptor loginInterceptor = new LoginInterceptor();
InterceptorRegistration loginRegistry = registry.addInterceptor(loginInterceptor);
// 拦截路径
loginRegistry.excludePathPatterns("/WEB-INF/jsp");
loginRegistry.addPathPatterns("/adminLogin/**");}
}
然后得到解决,可以访问了
解决二
在入口类注入视图解析器
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan({“com.jcl.gycms.mapper”})
public class GycmsApplication {
public static void main(String[] args) {
SpringApplication.run(GycmsApplication.class, args);
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//单个文件最大
factory.setMaxFileSize(“10240KB”); //KB,MB
//设置总上传数据总大小
factory.setMaxRequestSize(“102400KB”);
return factory.createMultipartConfig();
}
@Bean
public InternalResourceViewResolver setupViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
/** 设置视图路径的前缀 */
resolver.setPrefix("/WEB-INF/jsp/");
/** 设置视图路径的后缀 */
resolver.setSuffix(".jsp");
return resolver;
}
}