Spring Boot 学习系列(05)—自定义视图解析规则
此文已由作者易国强授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
自定义视图解析
在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是ContentNegotiatingViewResolver,这个解析器比较智能,它会根据你的请求类型(一般以请求uri的后缀来区分或请求头的Accept得到)来自动选择返回的数据文档类型。
一般情况下,这个能满足大部分人的使用需求,但我们这里只是需要提供RESTful接口的话,那么这个解析规则就不太适合我们了,比如说我们的心跳检测controller中如果返回的是非字符串类型的数据(字符串默认是可以解析成功的),那么就会提示解析失败的错误,
或如下的异常信息:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
....
在这里我们可以在主入口类中继承WebMvcConfigurerAdapter类,修改默认视图解析的解析规则,示例如下所示,这里favorPathExtension方法表示是否支持后缀匹配,我们这里直接设置为false即可实现我们的需求,其他不做任何修改,那么我们的所以返回结果会根据自定义的解析策略返回jackson解析的json格式数据。
@SpringBootApplicationpublic class BingoWebApplication extends WebMvcConfigurerAdapter { public static void main(String[] args) {
SpringApplication.run(BingoWebApplication.class, args);
} @Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
}上面代码中提到ContentNegotiationConfigurer 这个配置类还可以自定义很多解析的规则,比如ignoreAcceptHeader方式设置是否匹配请求头的信息,defaultContentType方法设置默认匹配类型等等。具体大家可以自己试下。
另外,如果我们需要自定义其他解析器,比如我们常用的freemarker的解析器,那么也很简单,我们仍然可以在主入口类中继承WebMvcConfigurerAdapter类或自定义一个类继承WebMvcConfigurerAdapter类,但需要注意自定义类需要加上@Configuration的注解,然后在里面我们实例化一个视图解析的bean即可。如下所示:
@Beanpublic FreeMarkerViewResolver getFreeMarkerViewResolver(){
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setPrefix("");
resolver.setSuffix(".ftl");
resolver.setContentType("text/html; charset=UTF-8");
resolver.setRequestContextAttribute("rc"); return resolver;
}
上面的代码很简单,实际和我们平时在xml中配置的视图解析配置一样。这个Bean实际是覆盖了默认的viewResolver,达到了自定义解析的目的。
扩展
上面简单介绍了如果需要自定义freemarker的视图解析该如何配置,实际上还有另外的方法,spring boot 其实已经帮我们做了很多事情,比如说它集成了freemarker的功能,那么我们只需要引入相关的依赖即可达到我们的目的,在pom文件中加入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId></dependency>
加入上述依赖即可正常使用freemarker的功能,默认情况下无需其他的配置,我们的静态文件可以放在工程的static目录,模板文件则放在templates目录下即可,这两个目录在我们新建工程的时候就自动帮我创建完成了,如果不是采用的框架自动创建的,那么手动创建此目录即可,当然你可以设置其他自定义的存放目录,在核心配置文件中自定义设置即可,比如设定ftl文件路径
:spring.freemarker.template-loader-path=classpath:/templates
不足之处,欢迎指正,谢谢~
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 认识用户访谈
Spring Boot 学习系列(05)—自定义视图解析规则的更多相关文章
- Spring Boot 学习系列(08)—自定义servlet、filter及listener
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...
- Spring Boot 学习系列(09)—自定义Bean的顺序加载
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...
- Spring Boot 学习系列(03)—jar or war,做出你的选择
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...
- Spring Boot 学习系列(10)—SpringBoot+JSP的使
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...
- Spring boot 学习笔记 1 - 自定义错误
Spring Boot提供了WebExceptionHandler一个以合理的方式处理所有错误的方法.它在处理顺序中的位置就在WebFlux提供的处理程序之前,这被认为是最后一个处理程序. 对于机器客 ...
- Spring Boot 学习系列(06)—采用log4j2记录日志
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...
- Spring Boot 学习系列(07)—properties文件读取
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...
- Spring Boot 学习系列(01)—从0到1,只需两分钟
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 快速构建 如果我们想基于spring mvc 提供一个简单的API查询服务,传统的方式,首先需要我们引入sp ...
- Spring Boot 学习系列(序)—Spring Boot
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...
随机推荐
- Python 修改ha配置文件
任务要求: 1.用户输入字符串 {"backend": "test.oldboy.org","record":{"server&q ...
- 一些js和JQuery的方法
取值填值: js: get-- innerText, innerHTML, value; set-- innerText=?, innerHTML=?, value=?; JQuery: get-- ...
- 机器学习:集成学习(Ada Boosting 和 Gradient Boosting)
一.集成学习的思路 共 3 种思路: Bagging:独立的集成多个模型,每个模型有一定的差异,最终综合有差异的模型的结果,获得学习的最终的结果: Boosting(增强集成学习):集成多个模型,每个 ...
- DCloud-5+Runtime:杂项
ylbtech-DCloud-5+Runtime:杂项 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 ...
- CreateThread demo
#include "stdafx.h"#include<windows.h>#include<strsafe.h>//win2003SDK必须安装 要不无此 ...
- python 函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def fo ...
- 通过在Oracle子表外键上建立索引提高性能
根据我的经验,导致死锁的头号原因是外键未加索引(第二号原因是表上的位图索引遭到并发更新).在以下两种情况下,Oracle在修改父表后会对子表加一个全表锁: 1)如果更新了父表的主键(倘若遵循关系数据库 ...
- 使用pip一次升级所有安装的Python包(太牛了)
import pip from subprocess import call for dist in pip.get_installed_distributions(): call("pip ...
- Python的安装以及路径的设置(python的下载地址:www.python.org)
在有的Python版本中在安装时,我们的可以再安装时选择Python路径的自动配备 在选择python的安装程序的时候,我们尽量选择python的2.版本,因为随着Python的更新,Python的数 ...
- LinkedHashMap和HashMap的区别
一.问题描述: 前几天写webservices接口,需要同步人力资源,涉及到添加顺序:主账号需要添加在次账号之前,直接上级需要添加在下级之前.解析xml之后直接封装在HashMap中,导致取对象时顺序 ...