Spring Boot 启动项目返回对象时 页面 spring boot type=Not Acceptable, status=406
2017-12-05 13:17
1076 查看
错误原因:
Spring Boot的MVC默认配置中使用的 ViewResolver 为 ContentNegotiatingViewResolver,该视图解析器的功能是根据要请求的文档类型,来查找不同的视图以返回对应格式的文档。请求的文档类型要可以从请求头中的Accept中获取,也可以通过URI后缀名得到,如/login.html即为请求HTML格式的文档,这两种方式分别对应着两种不同的Strategy(策略),默认为根据URI后缀名。
因此,当用户请求 /login.html 时,spring会查找/login对应的控制器,并得到其返回的文档类型为application/json, 然后判断它与后缀名.html文档类型是否匹配,如果不匹配,就报HttpMediaTypeNotAcceptableException了。
其实它的初衷是好的,它是想实现访问/user.json时返回JSON数据,访问/user.html返回HTML, 访问/user.xml则返回XML的功能。但是在这里我们只用Spring Boot提供RESTful接口,因此该功能就无用武之地了。
解决方案
我们刚才在上面说了Spring 会通过URI后缀获取请求格式,当访问/login.html的时候,那么根据当前的URI获取到后缀.html,那么判断与.html文档类型是否匹配,匹配的话执行相应的解析器。那么我们就会想,我们能够关闭这种默认的后缀匹配规则呢,既然本文章说是完美解决答案就是肯定的。解决步骤就两步骤:
(1)在启动类App.java类中继承:WebMvcConfigurerAdapter
(2)覆盖方法:configureContentNegotiation
具体代码如下:
package com.kfit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
*
* @author Angel --守护天使
* @version v.0.1
* @date 2016年7月29日下午7:06:11
*/
@SpringBootApplication
public class ApiCoreApp extends WebMvcConfigurerAdapter {
/**
(1)在启动类App.java类中继承:WebMvcConfigurerAdapter
(2)覆盖方法:configureContentNegotiation
favorPathExtension表示支持后缀匹配,
属性ignoreAcceptHeader默认为fasle,表示accept-header匹配,defaultContentType开启默认匹配。
例如:请求aaa.xx,若设置<entry
key="xx" value="application/xml"/> 也能匹配以xml返回。
根据以上条件进行一一匹配最终,得到相关并符合的策略初始化ContentNegotiationManager
*/
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
{
configurer.favorPathExtension(false);
}
public static void main(String[] args)
{
SpringApplication.run(ApiCoreApp.class, args);
}
}
这里说下核心代码:
configurer.favorPathExtension(false);
favorPathExtension表示支持后缀匹配,
属性ignoreAcceptHeader默认为fasle,表示accept-header匹配,defaultContentType开启默认匹配。
例如:请求aaa.xx,若设置<entry key="xx" value="application/xml"/> 也能匹配以xml返回。
根据以上条件进行一一匹配最终,得到相关并符合的策略初始化ContentNegotiationManager
Spring Boot的MVC默认配置中使用的 ViewResolver 为 ContentNegotiatingViewResolver,该视图解析器的功能是根据要请求的文档类型,来查找不同的视图以返回对应格式的文档。请求的文档类型要可以从请求头中的Accept中获取,也可以通过URI后缀名得到,如/login.html即为请求HTML格式的文档,这两种方式分别对应着两种不同的Strategy(策略),默认为根据URI后缀名。
因此,当用户请求 /login.html 时,spring会查找/login对应的控制器,并得到其返回的文档类型为application/json, 然后判断它与后缀名.html文档类型是否匹配,如果不匹配,就报HttpMediaTypeNotAcceptableException了。
其实它的初衷是好的,它是想实现访问/user.json时返回JSON数据,访问/user.html返回HTML, 访问/user.xml则返回XML的功能。但是在这里我们只用Spring Boot提供RESTful接口,因此该功能就无用武之地了。
解决方案
我们刚才在上面说了Spring 会通过URI后缀获取请求格式,当访问/login.html的时候,那么根据当前的URI获取到后缀.html,那么判断与.html文档类型是否匹配,匹配的话执行相应的解析器。那么我们就会想,我们能够关闭这种默认的后缀匹配规则呢,既然本文章说是完美解决答案就是肯定的。解决步骤就两步骤:
(1)在启动类App.java类中继承:WebMvcConfigurerAdapter
(2)覆盖方法:configureContentNegotiation
具体代码如下:
package com.kfit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
*
* @author Angel --守护天使
* @version v.0.1
* @date 2016年7月29日下午7:06:11
*/
@SpringBootApplication
public class ApiCoreApp extends WebMvcConfigurerAdapter {
/**
(1)在启动类App.java类中继承:WebMvcConfigurerAdapter
(2)覆盖方法:configureContentNegotiation
favorPathExtension表示支持后缀匹配,
属性ignoreAcceptHeader默认为fasle,表示accept-header匹配,defaultContentType开启默认匹配。
例如:请求aaa.xx,若设置<entry
key="xx" value="application/xml"/> 也能匹配以xml返回。
根据以上条件进行一一匹配最终,得到相关并符合的策略初始化ContentNegotiationManager
*/
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
{
configurer.favorPathExtension(false);
}
public static void main(String[] args)
{
SpringApplication.run(ApiCoreApp.class, args);
}
}
这里说下核心代码:
configurer.favorPathExtension(false);
favorPathExtension表示支持后缀匹配,
属性ignoreAcceptHeader默认为fasle,表示accept-header匹配,defaultContentType开启默认匹配。
例如:请求aaa.xx,若设置<entry key="xx" value="application/xml"/> 也能匹配以xml返回。
根据以上条件进行一一匹配最终,得到相关并符合的策略初始化ContentNegotiationManager
相关文章推荐
- Spring boot启动返回jsp页面
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
- 关于IDEA启动Spring Boot项目出现Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext at j
- spring boot 项目三种启动方式
- spring-boot项目启动失败的一种解决办法:自带的tomcat容器切换成jetty容器
- [Spring boot] web应用返回jsp页面
- springboot返回modelandview页面
- 使用IDEA启动在Eclipse中运行过的Springboot项目时翻车情况
- Spring boot项目设定返回数据为JSON固定格式
- IDEA中SpringBoot项目启动遇到端口被占用(Address already in use: bind)
- 如何把springboot项目设置成Windows系统开机启动
- 【spring boot】5.spring boot 创建web项目并使用jsp作前台页面
- spring boot 自己创建项目启动不了
- Spring Boot---Web应用返回jsp页面
- 创建spring boot项目启动报错遇到的问题
- [Spring boot] web应用返回jsp页面
- springboot 项目使用freemarker 配置之后,访问静态和动态页面的方法
- 使用springboot创建web项目(一),登录页面
- 携程 Apollo 配置中心 | 学习笔记(三) 自定义Spring Boot项目通过配置中心启动项目
- spring-boot-framework 如何自动将对象返回成json格式