webmvcconfigureradapter已过时_webcontent报错
WebMvcConfigurer 与 WebMvcConfigurationSupport 关系及避坑指南
2.类路径上的 HttpMessageConverter 失效该类提供了主要的 MVC 配置方法,通过直接继承 WebMvcConfiguration ,并在继承类上 加上 @EnableWebMvc 和 @Configuration 注解之后。便可以在子类中实现父类的方法 ,更甚至可以实现含有@Bean 注解的方法,但记得一定要在实现的方法上加上 @Bean
webmvcconfigureradapter已过时_webcontent报错
webmvcconfigureradapter已过时_webcontent报错
WebMvcConfigurationSupport 中提供了一些内容为空的方法,这些方法主要是用来给子类自定义时实现,根据方法名称的分类,有以下几种类型
WebMvcConfigurationSupport 在整个应用程序中只会生效一个,如果用户已经实现了 WebMvcConfigurationSupport,则 DelegatingWebMvcConfiguration 将不会生效,换句话来说,WebMvcConfigurer 的所有实现类将不会生效。而在Spring 中,如果类路径上不存在 WebMvcConfigurationSupport 的实例,则将会默认实现
WebMvcConfigurerAdapter、DelegatingWebMvcConfiguration 来自定义mvc 配置。
而当 WebMvcAutoConfiguration 不生效时会导致以下几个问题:
1.WebMvcProperties 和 ResourceProperties 失效
如:
StringHttpMessageConverter 会使用 spring..encoding.charset 配置, 默认编码为:ISO-8859-1
常用解决方案:
因为已知的配置类都已通过 @Bean 注册在容器中,那么我们可以在使用 Web导致无法视图解析器无法解析并返回到对应的视图。MvcConfigurationSupport 时,通过 @Autowired 注入到配置类中,然后替换调 WebMvcConfigurationSupport 默认的配置即可,如该类是通过 "回调" 的方式来进行自定义化 Spring MVC 相关配置,大多数情况下,我们通过实现它的 抽象类 WebMvcConfigurerAdapter 来配置,因为它有WebMvcConfigurer 接口所有方法的一个空的实现,WebMvcConfigurer 接口中的所有方法都是 WebMvcConfigurationSupport 中提供给子类实现的空方法。:
也可以根据需求来重新实现。总之明白为什么会失效之后,解决起来思路也更清晰
Spring Security解析五:WebSecurityConfigurerAdapter
HttpSecurity的继承关系与WebSecurity几乎一样,只是多实现了一个HttpSecurityBuilderSpring Security解析三:SecurityFilterChain创控制的输出反映了配置多个的执行流程:建过程 章节说到,WebSecurityConfigurerAdapter是构建SecurityFilterChain的关键,在WebSecurityConfigurerAdapter的init方法中会创建一个SecurityBuilder
WebSecurityConfigurerAdapter的源码如下
再来整体回顾下初始化的过程
webmvcconfigurationsupport导致springvalidate失效
在spring boot的自定义配置类继承 WebMvcConfigurationSuppor失效的原因t 后,发现自动配置的静态资源路径(classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/)不生效。继承WebMvcConfigurationSupport类是会导致自动配置失效的原因:
首先看一下 自动配置类的定义:
这是因为在 springboot的web自动配置类 WebMvcAutoConfiguration 上有条件注解
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
这个注解的意思是在项目类路径中 缺少 WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。
如果想要使用自动配置生效,又要按自己的需要重写某些方法,比如增加 viewController ,则可以自己的配置类可以继承 WebMvcConfigurerAdapter 这个类。不过在spring5.0版本后这个类被丢弃了 WebMvcConfigurerAdapter ,虽然还可以用,但是看起来不好 = =。
这是类上的注释,意思是spring 5.0后DelegatingWebMvcConfiguration 类 简称【类】通过继承 WebMvcConfigurationSupport,所以拥有了 customize 自定义mvc 配置的权利。该类通过持有的对象 WebMvcConfigurerComite 简称【聚合类】则是一个聚合了所有实现了 WebMvcConfigurer 接口的子类,如此一来,【类】所有实现 WebMvcConfigurationSupport 的方法调用时,则是将【聚合类】中的所有WebMvcConfiguer 接口的实现类的该方法依次进行调用要使用Ja8,而在Ja8中接口是可以有default方法的,所以这个类就没必要了。所以我们只需要在自定义配置类中直接实现
————————————————
版权声明:本文为CSDN博主「fmwind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
WebMvcConfigurationSupport和WebMvcConfigurer的区别
总的来说,在 WebSecurityConfigurerAdapter 中创建了HttpSecurity 实例,并将该实例存入WebSecurity的中,同时在WebSecurityConfigurerAdapter中为HttpSecurity 配置了一些默认的行为,例如CsrfConfigurer,ExpressionUrlAuthorizationConfigurer、FormLoginConfi原文链接:gurer等。到目前为止,从SpringBoot的启动到Security的Filter的创建和注册过程都已完成,接下来的问题是认证和授权又是在哪里进行的呢? 关于这方面的问题留在后面的章节中来探讨。继承WebMvcConfigurationSupport会发现Spring Boot的WebMvc自动配置失效(WebMvcAutoConfigura下面用一个demo来演示执行流程tion自动化配置)。
SpringBoot之HandlerInterceptorAdapter
运行流程总结如下:在HandlerInter可能这里的描述有点不好懂(我自己也这么觉得),所以简单举个例子,例如:在webroot目录下有一个:1.png 我们知道Servelt规范中web根目录(webroot)下的文件可以直接访问的,但是由于DispatcherServlet配置了映射路径是:/ ,它几乎把所有的请求都拦截了,从而导致1.png 访问不到,这时注册一个DefaultServletHttpRequestHandler 就可以解决这个问题。其实可以理解为DispatcherServlet破坏了Servlet的一个特性(根目录下的文件可以直接访问),DefaultServletHttpRequestHandler是帮助回归这个特性的。ceptorAdapter中主要提供了以下的方法:
为什么是说它是通过回调来实现的自定义配置? 用DelegatingWebMvcConfiguration 和 WebMvcConfigurerComite 类来解释。preHandle:在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个。如果返回false,则中断执行,也就是说我们想调用的方法 不会被执行,但是你可以修改response为你想要的响应。
tHandle:在方法执行后调用。
afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。
在HandlerInterceptorAdapter中主要提供了以下的方法:
HandlerInterceptor
适配器HandlerInterceptorAdapter
有时候我们可能只需要实现三个回调方法中的某一个,如果实现HandlerInterceptor接口的话,三个方法必须实现,不管你需不需要,此时spring提供了一个HandlerInterceptorAdapter适配器(种适配器设计模式的实现),允许我们只实现需要的回调方法。
这样在我们业务中比如要记录系统日志,日志肯定是在afterCompletion之后记录的,否则中途失败了,也记录了,那就扯淡了。一定是程序正常跑完后,我们记录下那些对数据库做个增删改的作日志进数据库。所以我们只需要继承HandlerInterceptorAdapter,并重写afterCompletion一个方法即可,因为preHandle默认是true。
定义一个类继承HandlerInterceptorAdapter,并重写方法
快捷键ctrl+o打开可以重写的方法面板选择
WebMvcConfigurerAdapter 抽象类是对WebMvcConfigurer接口的简单抽象(增加了一些默认实现),但在在SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapter已被废弃 。直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport
实现WebMvcConfigurer配置
在中写一个方法并访问
会在控制台输出
此时在加入一个,会按照配置的顺序执行,配置如下
如果controller出现异常,则不会继续执行tHandle,只会倒序执行afterCompletion方法
咱们下期见。
SpringBoot WebMvcConfigurer详解
WebMvcConfigurer配置类其实是 Spring 内部的一种配置方式,采用 JaBean 的形式来代替传统的 xml 配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于ja-based方式的spring mvc配置,需要创建一个 配置 类并实现 WebMvcConfigurer 接口;
在Spring Boot 1.5版本都是靠重写 WebMvcConfigurerAdapter 的方法来添加自定义,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,方式一实现WebMvcConfigurer接口(),方式二继承WebMvcConfigurationSupport类,具体实现可看这篇文章。
常用的方法:
以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到springboot2.0之后配置extends 的WebMvcConfigurerAdapter过时,取而代之的是WebMvcConfigurationSupport。WebMvcConfigurerAdapter只是对WebMvcCofigurer的空实现,而WebMvcConfigurationSupport的实现的方法更全面页面,感觉好麻烦,其实重写WebMvcConfigurer中的addViewControllers方法即可达到效果了
值的指出的是,在这里重写addViewControllers方法,并不会覆盖 WebMvcAutoConfiguration (Springboot自动配置)中的addViewCont如:StringHttpMessageConverterConfiguration、MappingJackson2HttpMessageConverter ,因为 HttpMessageConverters 中持有着所有HttpMessageConverter的实例, 在 WebMvcAutoConfigurationAdapter 中会注入 HttpMessageConverters ,因此当 WebMvcAutoConfigurationAdapter 不加载时,则会失效,间接的造成 spring..encoding.charset 与 spring.jackson.date-format 象的失效。rollers(在此方法中,Spring Boot将“/”映射至index.html),这也就意味着自己的配置和Spring Boot的自动配置同时有效,这也是我们添加自己的MVC配置的方式。
比如,我们想自定义静态资源映射目录的话,只需重写addResourceHandlers方法即可。
注:如果继承WebMvcConfigurationSupport类实现配置时必须要重写该方法,具体见其它文章1、手动配置mvc框架,1.5.可以在配置类中继承抽象类 WebMvcConfigurerAdapter
此时会注册一个默认的Handler:DefaultServletHttpRequestHandler,这个Handler也是用来处理静态文件的,它会尝试映射/。当DispatcherServelt映射/时(/ 和/ 是有区别的),并且没有找到合适的Handler来处理请求时,就会交给DefaultServletHttpRequestHandler 来处理。注意:这里的静态资源是放置在web根目录下,而非WEB-INF 下。
这个方法是用来配置视图解析器的,该方法的参数ViewResolverRegistry 是一个注册器,用来注册你想自定义的视图解析器等。ViewResolverRegistry 常用的几个方法:
跨域资源共享向来都是热门的需求,我们可以使用 CORS 来快速实现 跨域访问,只需要在服务端进行授权即可,无需在前端添加额外的设置
简单说,CORS是一种访问机制,英文全称: Cross-Origin Resource Sharing,即我们说的跨域资源共享。当一个资源从与该资源本身所在不同的域或端口请求一个资源时,资源会发起一个跨域HTTP请求。比如,在一个域名下的网页中,调用另一个域名中的资源。
对于 CORS的跨域请求,上面的方式是重写webMvcConfigurer实现全局配置,这里展开一下,主要有以下几种方式可供选择:
在任意配置类,返回一个 新的 CorsFIlter Bean ,并添加映射路径和具体的CORS配置路径。
在上使用注解 @CrossOrigin :
在Controller方法上使用注解 @CrossOrigin :
使用 HttpServletResponse 对象添加响应头(Access-Control-Allow-Origin)来授权原始域,这里 Origin的值也可以设置为 "",表示全部放行。
SpringBoot 1.5.x和2.0.x区别
因为两个配置类中的属性都在 WebMvcAutoConfiguration 中使用以下是 WebMvcConfigurerAdapter 重写的方法
应用场景2.0.x已被废除,实现接口 WebMvcConfigurer 或者参考上面,此处省略直接继承 WebMvcConfigurationSupport
直接继承WebMvcConfigurationSupport
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。