SpringMVC用responsebody标签返回json的时候Error406

Easter79
• 阅读 707

springmvc的好处就是可以用一个responsebody的标签直接将一个返回的对象转换成json

首先,需要配置spring,将以下的bean配置到spring的配置文件中

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
        <property name="messageConverters">  
            <list>  
                <ref bean="mappingJacksonHttpMessageConverter" />  
            </list>  
        </property>  
    </bean>  
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  
        <property name="supportedMediaTypes">  
            <list>  
                <value>application/json;charset=UTF-8</value>  
            </list>  
        </property>  
    </bean>

其中,MappingJasonHttpMessageConvert继承了AbstractHttpMessageConverter,其他的convert还有

ByteArrayHttpMessageConverter

StringHttpMessageConverter

ResourceHttpMessageConverter

SourceHttpMessageConverter

XmlAwareFormHttpMessageConverter

Jaxb2RootElementHttpMessageConverter

MappingJacksonHttpMessageConverter这个convert可以支持类对象及Hashmap的转换

我们还需要配置对应的jakson的依赖,在pom中应该如下配置

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-core</artifactId>
   <version>2.4.1</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.4.1.1</version>
</dependency>
<dependency>
   <groupId>org.codehaus.jackson</groupId>
   <artifactId>jackson-core-asl</artifactId>
   <version>1.9.13</version>
</dependency>

<dependency>
   <groupId>org.codehaus.jackson</groupId>
   <artifactId>jackson-mapper-asl</artifactId>
   <version>1.9.13</version>
</dependency>

接下来在java中调用

@RequestMapping(value="getSearchResult.do")
@ResponseBody
public BaseJsonResult getSearchResult(HttpServletRequest request,
                                           HttpServletResponse response,
                                           HttpSession session,
                                           SearchParaDO searchParaDO) {
    try{
        String serachResultJsonString=service.getSeachResult(userMap, searchParaDO);
        SuccessJsonResult successJsonResult=new SuccessJsonResult(serachResultJsonString);
        return successJsonResult;
    }catch (Exception e){
        logger.error(e);
        FailureJsonResult failureJsonResult=new FailureJsonResult(e.getMessage(),e);
        return failureJsonResult;
    }
}

但是就是在前台正常调用的时候,返回了406的错误,网上找了很多相同的case基本上就是配置了以上的spring及jar包就可以解决了。

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

接下来继续分析,BaseJsonResult是我自己定义的一个抽象类,SuccessJsonResult和FailureJsonResult

其中定义了对应的filed,但是这些filed只是在继承类中做输出用,并没有实现对应的get方法。当然这些filed访问控制的也是default的

这样当jakson将对应的对象转换为相应的json的获取不到对应的filed就没有转换成功。

那么将对应的field暴露出去应该可以解决转换失败的问题,于是有以下两种方法解决

1.将对应的filed改成public的访问控制

2.暴露public的get方法

于是解决了问题,前台可以正常获取到对应对象转换的json串了。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
springboot自定义消息转换器HttpMessageConverter
  在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制就是利用HttpMessageConverter来实现的,Spring内置了很多HttpMessageConverter,比如MappingJackson2HttpMessageConver
Easter79 Easter79
3年前
springMvc HandlerMethodArgumentResolver
SpringMvc在配置多个mvc:argumentresolvers(目前是分开在不同的配置文件)会出现覆盖问题;实际spring容器中只会有一个文件里配置的bean原因debug后发现,MVC实际是在调用一个name为org.springframework.web.servlet.mvc.method.annot
Stella981 Stella981
3年前
Retrofit网络框架入门使用
1.简单介绍retrofit事实上就是对okhttp做了进一步一层封装优化。我们仅仅须要通过简单的配置就能使用retrofit来进行网络请求了。Retrofit能够直接返回Bean对象,比如假设我们进行一个网络接口的请求。返回来一串json字符串。那么这个时候一般我们都要拿到这个json字符串后进行解析得到相应的Bean对象,Ret
Stella981 Stella981
3年前
Spring 学习笔记(三):Spring Bean
1Bean配置Spring可以看做是一个管理Bean的工厂,开发者需要将Bean配置在XML或者Properties配置文件中。实际开发中常使用XML的格式,其中<bean中的属性或子元素如下:id:Bean在BeanFactory中的唯一标识,在代码中通过BeanFac
Easter79 Easter79
3年前
SSM_基于传统web项目
1.这是一个单模块的项目!有四个配置文件,mybaits,spring。springmvc,web.xml!2.web.xml配置文件,导入spring和springmvc的配置文件,spring配置文件中,获取sqlsession,以及关联mybatis的mpper(增删改查)文件3.mybatis的配置文件则可以不用写
Stella981 Stella981
3年前
Spring Boot 406(type=Not Acceptable, status=406)异常解决办法
使用SpringBoot,Controller请求返回的参数类型是ResponseBody,如果请求的时候使用使用配置的默认请求扩展名,例如.html,SpringMVC会抛出一个typeNotAcceptable,status406错误,如下:WhitelabelErrorPageThisapplica
Stella981 Stella981
3年前
Ajax和SpringMVC之间JSON交互
Ajax和SpringMVC之间的json数据传输有两种方式:1.直接传输Json对象2.将Json序列化成json字符串1.直接传输Json对象前端Ajax$(document).ready(function(){$("btn_login").click(function(){
Easter79 Easter79
3年前
SpringMvc @JsonView 使用方式
准确来说,@JsonView注解不是Spring的,它位于jacksonannotation包中;作用:SpringMvc使用@ResponseBody将结果以json返回客户端, 有些实体类的某些字段可以不被包括在JSON中;思考了这种情况可能适用的情形:有多方调用这个接口,需要针对不同业务场景返回不同形式的JSON,但是这种情况的话只拷贝需要
Stella981 Stella981
3年前
SSM_基于传统web项目
1.这是一个单模块的项目!有四个配置文件,mybaits,spring。springmvc,web.xml!2.web.xml配置文件,导入spring和springmvc的配置文件,spring配置文件中,获取sqlsession,以及关联mybatis的mpper(增删改查)文件3.mybatis的配置文件则可以不用写
Easter79 Easter79
3年前
Spring高级应用之注入嵌套Bean
在Spring中,如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean。和普通的Bean一样,使用<bean元素来定义嵌套的Bean,嵌套Bean只对它的外部的Bean有效,Spring容器无法直接访问嵌套的Bean,因此定义嵌套Bean也无需指定id属性。如下配置片段是一个嵌套Bean的示例:<bean id
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k