Spring Boot 学习系列(05)—自定义视图解析规则

此文已由做者易国强受权网易云社区发布。
html

欢迎访问网易云社区,了解更多网易技术产品运营经验。web

自定义视图解析


  • 在默认状况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是ContentNegotiatingViewResolver,这个解析器比较智能,它会根据你的请求类型(通常以请求uri的后缀来区分或请求头的Accept获得)来自动选择返回的数据文档类型。spring

  • 通常状况下,这个能知足大部分人的使用需求,但咱们这里只是须要提供RESTful接口的话,那么这个解析规则就不太适合咱们了,好比说咱们的心跳检测controller中若是返回的是非字符串类型的数据(字符串默认是能够解析成功的),那么就会提示解析失败的错误,json




或以下的异常信息:安全


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方法设置默认匹配类型等等。具体你们能够本身试下。ide

  • 另外,若是咱们须要自定义其余解析器,好比咱们经常使用的freemarker的解析器,那么也很简单,咱们仍然能够在主入口类中继承WebMvcConfigurerAdapter类或自定义一个类继承WebMvcConfigurerAdapter类,但须要注意自定义类须要加上@Configuration的注解,而后在里面咱们实例化一个视图解析的bean便可。以下所示:spring-boot


@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,达到了自定义解析的目的。spa


扩展


  • 上面简单介绍了若是须要自定义freemarker的视图解析该如何配置,实际上还有另外的方法,spring boot 其实已经帮咱们作了不少事情,好比说它集成了freemarker的功能,那么咱们只须要引入相关的依赖便可达到咱们的目的,在pom文件中加入以下依赖:orm


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId></dependency>
  • 加入上述依赖便可正常使用freemarker的功能,默认状况下无需其余的配置,咱们的静态文件能够放在工程的static目录,模板文件则放在templates目录下便可,这两个目录在咱们新建工程的时候就自动帮我建立完成了,若是不是采用的框架自动建立的,那么手动建立此目录便可,固然你能够设置其余自定义的存放目录,在核心配置文件中自定义设置便可,好比设定ftl文件路径 :spring.freemarker.template-loader-path=classpath:/templates




  • 不足之处,欢迎指正,谢谢~


免费体验云安全(易盾)内容安全、验证码等服务


更多网易技术、产品、运营经验分享请点击


相关文章:
【推荐】 认识用户访谈

相关文章
相关标签/搜索