Spring Boot 启动项目返回对象时 页面 spring boot type=Not Acceptable, status=406

错误原因:

       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 2016729下午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.classargs);

    }

}

       这里说下核心代码:

configurer.favorPathExtension(false);

   favorPathExtension表示支持后缀匹配,

   属性ignoreAcceptHeader默认为fasle,表示accept-header匹配,defaultContentType开启默认匹配。

      例如:请求aaa.xx,若设置<entry key="xx" value="application/xml"/> 也能匹配以xml返回。

 

根据以上条件进行一一匹配最终,得到相关并符合的策略初始化ContentNegotiationManager

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当客户端请求接口,服务器返回 406 状态码,表示服务器无法提供请求的资源的内容特性,无法满足客户端的请求头中指定的条件。 这种情况通常是因为客户端请求的数据格式不被服务器所支持,或者客户端请求头中 Accept 属性设置不正确导致的。 在 Spring Boot 中,我们可以通过添加以下配置来解决这个问题: ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { // 添加转换器 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new MappingJackson2HttpMessageConverter()); } // 配置内容协商解析器 @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false) .favorParameter(true) .parameterName("mediaType") .ignoreAcceptHeader(true) .useJaf(false) .defaultContentType(MediaType.APPLICATION_JSON) .mediaType("xml", MediaType.APPLICATION_XML) .mediaType("json", MediaType.APPLICATION_JSON); } } ``` 上述代码中,我们添加了一个 `MappingJackson2HttpMessageConverter` 转换器,用于将 Java 对象转换为 JSON 格式的数据。 同,我们还添加了一个内容协商解析器,用于根据客户端请求头中的 Accept 属性进行内容协商,如果客户端请求头中 Accept 属性为 `application/xml`,则返回 XML 格式的数据,如果为 `application/json`,则返回 JSON 格式的数据。 通过以上配置,我们可以解决 Spring Boot406 错误的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值