zoukankan      html  css  js  c++  java
  • 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




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


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


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


    相关文章:
    【推荐】 让App飞久一点
    【推荐】 消息推送平台高可用实践(下)

  • 相关阅读:
    Building a flexiable renderer
    Indirect Illumination in mental ray
    我的心情
    Cellular Automata
    Subsurface Scattering in mental ray
    Shader Types in mental ray
    BSP Traversal
    我的渲染器终于达到了MR的速度
    How to handle displacement and motion blur
    说明
  • 原文地址:https://www.cnblogs.com/zyfd/p/9883519.html
Copyright © 2011-2022 走看看