SpringMVC报错No converter found for return value of type的一种解决方案

本文介绍了在使用Spring MVC框架时,遇到FastJSON无法将对象转换为JSON格式的问题,并提供了两种解决方案:一是更换为Jackson库;二是自定义配置FastJSON MessageConverter。
  • 很久没有写过javaWeb的代码了,最近用javaWeb(没有使用maven和gradle)引入spring4.3.9相关的包做开发时遇到一些问题。其中一个是:
严重: 在路径为/xxh的上下文中,Servlet[dispatcher]的Servlet.service()引发了具有根本原因的异常Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class xyz.ruankun.xxh.vo.ReponseVO
java.lang.IllegalArgumentException: No converter found for return value of type: class xyz.ruankun.xxh.vo.ReponseVO
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:187)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:174)
	at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:113)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	......

在这里插入图片描述

  • 那么如何报了这个错误呢?

  • 原因是我配置了一个RestController并且返回了一个对象。
    在这里插入图片描述

  • 这个controller定义本身没有问题,在看看我dispatcher-servlet.xml中关于messageConverter的配置:
    在这里插入图片描述
    很明显,我没有定义什么类型的消息转换器。

  • 从网上搜索得到的答案是spring默认是依赖jackson来做消息转换处理的,不需要配置。但是我看看我的依赖里面:
    在这里插入图片描述

  • 我使用的是fastJson,所以springmvc没有办法将返回的对象转换成json对象就报错了。所以解决的办法现在有两个:

  • 一是将fastJson改为jackson,引入jackson的包。

  • 二是配置一下fastJson的messageConvertor

	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<property name="defaultCharset" value="utf-8">
				</property>
			</bean>
			<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <value>WriteMapNullValue</value>
                        <value>QuoteFieldNames</value>
                    </list>
                </property>
            </bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

除此之外,还有一些是因为没有在java Object中添加setter方法,最好把getter也加上。还有一些是因为其它奇怪的原因,这一类问题建议一是在思考一下,冷静下来调试一下代码;另外一个是多用百度和谷歌搜一搜,应该是能解决问题的,都是时间问题。

### Spring HttpMessageConverter 与响应类型不匹配的问题分析 在 Spring MVC 中,`HttpMessageConverter` 是用于将 HTTP 请求和响应转换为 Java 对象的核心组件。当出现 `no suitable for response type [class cn.itcast.order.pojo.User] and content type [text/plain;charset=UTF-8]` 的错误时,通常是因为以下原因之一导致的: 1. **内容协商失败**:Spring MVC 根据 `Accept` 请求头或路径扩展名来决定返回的内容类型。如果客户端请求的 `Accept` 头部与服务器支持的内容类型不匹配,则会导致此问题[^2]。 2. **未注册合适的 `HttpMessageConverter`**:Spring 默认会注册一些常见的 `HttpMessageConverter`(如 `MappingJackson2HttpMessageConverter` 用于处理 JSON)。如果目标对象需要以特定格式序列化,但没有对应的 `HttpMessageConverter` 被注册,则会抛出此异常[^3]。 3. **返回类型不兼容**:控制器方法的返回类型必须与 `HttpMessageConverter` 支持的类型匹配。例如,如果返回的是一个自定义对象,但没有配置 JSON 或 XML 的转换器,则无法正确处理。 --- ### 解决方案 #### 1. 确保已启用 `<mvc:annotation-driven>` 如果使用 XML 配置,确保在 `springmvc.xml` 文件中启用了 `<mvc:annotation-driven>`,这会自动注册默认的 `HttpMessageConverter`,包括 `MappingJackson2HttpMessageConverter` 和其他常用的转换器[^1]。 ```xml <mvc:annotation-driven /> ``` #### 2. 检查 `HttpMessageConverter` 注册情况 如果需要支持额外的媒体类型(如 JSON 或 XML),可以手动配置 `HttpMessageConverter`。例如,添加 Jackson 支持以处理 JSON 响应: ```java @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON)); converters.add(converter); } } ``` #### 3. 修改控制器方法的返回类型 确保控制器方法返回的对象能够被序列化为 JSON 或其他指定的媒体类型。例如,如果返回的是 `User` 对象,需确保该对象具有无参构造函数和 getter 方法,并且字段是可序列化的。 ```java @RestController @RequestMapping("/users") public class UserController { @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) public User getUserById(@PathVariable Long id) { // 假设有一个服务获取用户信息 return userService.findById(id); } } ``` #### 4. 设置正确的 `Content-Type` 如果客户端期望的响应类型是 `text/plain`,但实际返回的是复杂对象(如 `User`),则需要调整 `produces` 属性以匹配客户端的需求。例如: ```java @GetMapping(value = "/plain/{id}", produces = MediaType.TEXT_PLAIN_VALUE) public String getUserPlain(@PathVariable Long id) { User user = userService.findById(id); return user.getName(); // 返回简单的字符串 } ``` #### 5. 检查依赖是否完整 确保项目中包含 Jackson 或其他序列化库的依赖。例如,Maven 项目的依赖如下: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.0</version> </dependency> ``` --- ### 总结 上述问题的根本原因在于 `HttpMessageConverter` 未能正确处理返回的 `User` 对象和指定的 `Content-Type`。通过启用 `<mvc:annotation-driven>`、检查 `HttpMessageConverter` 注册情况、调整控制器方法的返回类型以及设置正确的 `Content-Type`,可以有效解决此类问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值