【原创文章】
使用Spring Boot的Web项目,处理/login请求的控制器方法(该方法会返回JSON格式的数据)。此时如果访问localhost:8080/login.html,用户期望返回jsons数据,但框架却报错:
There was an unexpected error (type=Not Acceptable, status=406).
Could not find acceptable representation
或者这样的异常信息:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:235) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:382) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
错误原因:
Spring Boot的MVC默认配置中使用的 ViewResolver 为 ContentNegotiatingViewResolver,该视图解析器的功能是根据要请求的文档类型,来查找不同的视图以返回对应格式的文档。请求的文档类型要可以从请求头中的Accept中获取,也可以通过URI后缀名得到,如/login.html即为请求HTML格式的文档,这两种方式分别对应着两种不同的Strategy(策略),默认为根据URI后缀名。
ContentNegotiatingViewResolver中有说明:
The ContentNegotiatingViewResolver does not resolve views itself but rather delegates to other view resolvers, selecting the view that resembles the representation requested by the client. Two strategies exist for a client to request a representation from the server:
• Use a distinct URI for each resource, typically by using a different file extension in the URI. For example, the URIhttp://www.example.com/users/fred.pdf requests a PDF representation of the user fred, and http://www.example.com/users/fred.xmlrequests an XML representation.
• Use the same URI for the client to locate the resource, but set the Accept HTTP request header to list the media types that it understands. For example, an HTTP request for http:// www.example.com/users/fred with an Accept header set to application/pdf requests a PDF representation of the user fred, while http://www.example.com/users/fred with an Accept header set to text/xml requests an XML representation. This strategy is known as content negotiation.
因此,当用户请求 /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
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
网易云课堂视频最新更新:
第十一章 Spring Boot 日志
1、spring boot日志—理论
2、Spring Boot日志-logback
3、Spring Boot日志-log4j2
第十二章 Spring Boot 知识点2
1、spring boot 服务配置和部署
2、Spring Boot 定制URL匹配规则
历史章节:
第一章 快速开始
1、Spring Boot之Hello World
2、Spring Boot之Hello World访问404
第二章 Spring Boot之JSON
1、spring boot返回json数据
2、Spring Boot完美使用FastJson解析JSON数据
第三章 Spring Boot热部署
1、Spring Boot热部署(springloader)
2、springboot + devtools(热部署)
第四章 Spring Boot数据库
1、Spring Boot JPA/Hibernate/Spring Data概念
2、Spring Boot JPA-Hibernate
3、Spring Boot Spring Data JPA介绍
4、Spring Boot JdbcTemplate
5、Spring Boot集成MyBatis
第五章 web开发
1、全局异常捕捉
2、配置server信息
3、spring boot使用thymeleaf
4、Spring Boot 使用freemarker
5、Spring Boot添加JSP支持
第六章 定时任务
1、Spring Boot定时任务
2、Spring Boot 定时任务升级篇(动态修改cron参数)
3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)
4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)
5、Spring Boot Quartz介绍
6、Spring Boot Quartz在Java Project中使用
7、Spring Boot 集成Quartz普通使用
8、Spring Boot 集成Quartz升级版
9、Spring Boot 集成Quartz二次升级版
10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象
第七章 Spring Boot MyBatis升级篇
1、Spring Boot MyBatis升级篇-注解
2、Spring Boot MyBatis升级篇-注解-自增ID
3、Spring Boot MyBatis升级篇-注解-增删改查
4、Spring Boot MyBatis升级篇-注解-分页查询
5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效
6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found
7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇
8、Spring Boot MyBatis升级篇-注解-@Result
9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:<script>
10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider
11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题
12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper
13、Spring Boot MyBatis升级篇-XML
14、Spring Boot MyBatis升级篇-XML-自增ID
15、Spring Boot MyBatis升级篇-XML-增删改查
16、Spring Boot MyBatis升级篇-XML-分页查询
17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效
18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)
19、Spring Boot MyBatis升级篇-XML-注解-初尝试
20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter
第八章 Spring Boot 知识点1
1、Spring Boot 拦截器HandlerInterceptor
2、Spring Boot启动加载数据CommandLineRunner
3、Spring Boot环境变量读取和属性对象的绑定
4、Spring Boot使用自定义的properties
5、Spring Boot使用自定义的properties
6、Spring Boot使用@SpringBootApplication
7、Spring Boot 监控和管理生产环境
第十章 Spring Boot 打包部署
1、Spring Boot打包部署((提供Linux的sh文件))
第十一章 Spring Boot 日志
1、spring boot日志—理论
2、Spring Boot日志-logback
3、Spring Boot日志-log4j2
更多查看博客: http://412887952-qq-com.iteye.com/
相关推荐
1. **406 Not Acceptable**:这个错误通常是因为客户端没有在请求头中指定能接受JSON格式。确保请求头中有`Accept: application/json`。 2. **JSON转换异常**:如果Java对象有自定义类型或者复杂结构,Jackson可能...
406 Not Acceptable是HTTP协议中的一个状态码,它表示服务器无法按照客户端的Accept头找到适合的资源来响应。Accept头用于指定客户端能够接收的数据类型,如application/json或text/html。当服务器无法提供与Accept...
如果以上步骤都已完成,但仍遇到406错误,可能的原因包括但不限于:前端Accept头不正确、服务器端Content-Type设置错误、或者Jackson库版本与Spring版本不兼容。在这种情况下,逐一排查并修复这些潜在问题,应该能...
SIP 协议 会话初始协议 很有帮助 Contents 1 Introduction 9 2 Overview of SIP Functionality 10 3 Terminology 11 4 Overview of Operation 11 5 Structure of the Protocol 16 6 Definitions ...
然而,有时候这种转换过程中可能会出现错误,比如HTTP状态码406(Not Acceptable)。这个问题通常与服务器端的数据序列化配置有关,而Jackson库是Java世界中广泛使用的JSON处理库,能够帮助我们解决这类问题。本篇将...
强制性捐赠是否可接受? 强制性捐赠,尤其是针对学生群体,引发了广泛的讨论。在这个问题上,学校要求每位学生向有需要的人捐赠至少10元,虽然其初衷可能是为了筹集资金帮助贫困者,但这种做法是否恰当,需要深入...
这个问题的描述揭示了一个常见的问题,即当尝试从服务器返回一个自定义的对象到客户端时,可能会遇到HTTP状态码406(Not Acceptable)的错误。406错误通常表示服务器无法按照客户端接受的格式提供响应。在Spring MVC...
Spring框架在处理MVC架构下的Web应用中扮演了至关重要的角色,而Spring4.0作为其中一个重要的版本,其对于处理请求和响应的方法有了进一步的优化和改进。然而,在处理JSON数据请求时,用户可能会遇到HTTP状态码406...
- **406 Not Acceptable**:请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。 - **5xx** 系列:服务器错误,服务器遇到了一个未曾预料的情况,不能完成对请求的处理。 #### 五、Spring MVC ...
专栏博文“DICOM:基于DCMTK实现C-FIND SCU”中对应的源代码。基于dcmtk开源库中的findscu工程,实现的简单的C-FIND SCU,用于示范如何使用dcmtk操作实现具体的DICOM应用。
**HTTP 406 Not Acceptable** - **描述**:客户端请求的资源不被服务器所支持,无法用可接受的格式表示。 - **原因**:服务器无法按照客户端的要求返回数据。 - **解决方法**:检查客户端对媒体类型的支持。 ####...
如果你需要更新或修改BIOS,建议优先考虑官方提供的方法。 总之,“bios.wph提取工具”是一个实用的命令行工具,用于从BIOS更新文件中提取特定的数据。在进行此类操作前,请确保你具备相应的知识,遵循安全规范,...
6. **HTTP 406 Not Acceptable** - 描述:客户端无法接受服务器返回的数据类型。 - 解决方法:确认客户端可以接受的数据类型,并在请求中正确设置 Accept 头。 7. **HTTP 407 Proxy Authentication Required** -...
## Synopsis ... ## Motivation This was created because ElasticSearch 5 removed the ability to run ElasticSearch Head as an Elastic Plugin. This offers an alternative to self-hosting in your own web ...
### C++常见错误及解决方案 #### 一、在源码中遗失“;” **错误信息**: `syntax error: missing ‘;’` **错误示例**: ```cpp int test, number, test = 12; ``` **解决方案**: 在编程时,忘记在语句末尾加上...
- 406 Not Acceptable:服务器无法根据客户端请求的内容特性完成请求。 - 407 Proxy Authentication Required:要求代理身份验证。 - 412 Precondition Failed:客户端请求的部分条件未通过。 - 414 Request-URI...
本文将详细介绍20种常见的VC++编译错误信息,并针对每一种错误提供可能的原因及解决办法。 ### 1. 错误 C2065: 'identifier': undeclared identifier - **描述**:当编译器遇到一个未声明的标识符时,会出现此错误...
然而,在某些情况下,可能会遇到HTTP状态码为406(Not Acceptable)的错误,这通常是由于客户端和服务器之间的内容协商出现问题导致的。 406错误表示客户端无法接受服务器提供的内容类型。在JSON传输场景下,这可能...
可用于Spring MVC框架,spring MVC中返回使用@ResponseBody注解返回时,后台没报错,就控制台显示406 Not Acceptable 原因是缺少jackson的包:jackson-core-asl-1.9.2.jar和jackson-mapper-asl-1.9.2.jar