使用@responseBody遇见的异常

本文介绍了一个使用Spring MVC中@ResponseBody注解返回JSON数据的例子,并详细展示了配置文件的设置及依赖库,帮助解决常见错误。

下面是一个使用@responseBody的小例子:
必须有正确spring配置文件:

<mvc:annotation-driven>
         <mvc:message-converters>
             <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

                 <property name="objectMapper">
                     <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                         <property name="dateFormat">
                             <bean class="java.text.SimpleDateFormat">
                                 <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
                             </bean>
                         </property>
                     </bean>
                 </property>
             </bean>
             <!-- 解决乱码问题 -->
             <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >  

                 <property name="messageConverters">   
                       <list>   
                           <bean class = "org.springframework.http.converter.StringHttpMessageConverter">   
                              <property name = "supportedMediaTypes">
                                    <list>
                                        <value>text/html;charset=UTF-8</value>   
                                   </list>   
                              </property>   
                           </bean>   
                       </list>   
                 </property>  
            </bean>
         </mvc:message-converters>
     </mvc:annotation-driven>

所需的maven的依赖库(必不可少):

<dependencies>

        <dependency>
            <groupId>com.test1</groupId>
            <artifactId>subtest1</artifactId>
            <version>0.0.2-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-adb</artifactId>
            <version>${axis2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-transport-http</artifactId>
            <version>${axis2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-transport-local</artifactId>
            <version>${axis2.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.0.pr2</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.0.pr2</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0.pr2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
            <version>3.1.0</version>  
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>

    </dependencies>

控制层代码:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.pojo.TestBean;

@Controller
public class ServiceC {

    @RequestMapping(value="/jsontest")  
    public @ResponseBody List<TestBean> getJSON() {  
        List<TestBean> testBean = new ArrayList<TestBean>();  
        testBean.add(TestBean.generateContent("ee", new Date(), "test", "test"));  
        testBean.add(TestBean.generateContent("ee", new Date(), "test", "test"));  
        testBean.add(TestBean.generateContent("ee", new Date(), "test", "test"));  
        testBean.add(TestBean.generateContent("呃呃", new Date(), "呃呃", "test"));  

        return testBean;  
    }  

}

在浏览器中访问:http://localhost:8080/(项目名)/jsontest,即可访问,页面中会返回一个上面testBean生成的json字符串

一. 浏览器返回406
@requestMapping中的注解参数可能有问题,它没有把返回值当成json处理。

二.浏览器返回500,javax.servlet.ServletException: Circular view path […]: would dispatch back to the current handler URL [/…] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
对照以上正确的例子,@responseBody要加上,配置文件里的内容要写对。这里注意,配置文件中的类是新版本的json处理包com.fasterxml.jackson.core中的MappingJackson2HttpMessageConverter,而不是MappingJacksonHttpMessageConverter。

<think>好的,我现在要解决用户关于在SSM框架中正确使用@ResponseBody注解的问题。首先,我需要回顾一下@ResponseBody的基本作用。根据引用[1]和引用[2],这个注解通常用于Controller的方法上,将返回值直接写入HTTP响应体,而不是跳转到视图页面。这常用于返回JSON或XML数据给前端,比如Ajax请求。 接下来,我需要确认使用场景。用户可能想知道在哪些情况下应该使用这个注解。例如,当方法返回字符串时,如引用[1]的例子,加上@ResponseBody后,客户端会直接收到"hello"字符串,而不是视图名称。如果没有这个注解,Spring MVC会尝试解析为视图路径,可能导致404错误。 然后,关于如何正确使用,需要注意几点。首先,确保方法的返回值类型正确。如果返回对象,需要配置消息转换器,比如Jackson库来处理JSON转换。同时,要检查是否导入了正确的依赖,比如在Maven项目中添加Jackson的依赖,否则即使有注解也无法正确转换。 另外,用户可能遇到的问题包括中文乱码。这时候需要确认produces属性是否设置了正确的字符编码,如引用[2]提到的。例如,@RequestMapping(value="/data", produces="application/json;charset=UTF-8")可以解决编码问题。 还需要区分@ResponseBody和@RequestBody的区别,引用[2]提到@RequestBody用于接收请求体中的参数,而@ResponseBody用于处理响应体。这点需要明确说明,避免用户混淆。 最后,示例代码部分需要展示不同返回类型的用法,包括字符串、对象和结合@RequestMapping的情况。同时,要提醒用户常见的错误,比如缺少消息转换器导致转换失败,或者忘记注解导致返回视图而不是数据。 总结步骤:解释注解作用,使用场景,具体用法,示例代码,常见问题及解决方法。确保覆盖用户可能的所有疑问,并引用提供的资料来支持回答。</think>在SSM框架中,`@ResponseBody`注解用于将Controller方法的返回值直接写入HTTP响应体,而不是解析为视图路径。以下是具体用法和示例: ### 一、核心作用 1. **数据直接响应** 将返回值序列化为JSON/XML格式(默认JSON),直接返回给前端,适用于Ajax请求或RESTful接口[^1][^2]。 2. **跳过视图解析器** 避免返回值被视图解析器处理为JSP/Thymeleaf等模板路径。 ### 二、使用方式 #### 1. 基础用法(返回字符串) ```java @RequestMapping("/getStr") @ResponseBody public String getString() { return "操作成功"; // 直接返回纯文本内容 } ``` *提示*:若返回值含中文需设置编码,如: ```java @RequestMapping(value="/data", produces="text/plain;charset=UTF-8") ``` #### 2. 返回对象(自动转JSON) ```java @PostMapping("/user") @ResponseBody public User getUser() { return new User("张三", 25); // 需配置消息转换器(如Jackson) } ``` *依赖配置*(Maven): ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> ``` #### 3. 组合注解简化写法 ```java @RestController // = @Controller + @ResponseBody public class ApiController { @GetMapping("/list") public List<String> getList() { return Arrays.asList("A", "B", "C"); } } ``` ### 三、常见问题 1. **乱码问题** 在@RequestMapping中添加`produces="application/json;charset=UTF-8"` 2. **转换失败** 未导入Jackson依赖时,返回对象会报`HttpMediaTypeNotAcceptableException` 3. **与@RequestBody区别** `@RequestBody`用于接收请求体参数(如JSON数据),`@ResponseBody`用于处理响应输出 ### 四、完整示例 ```java @Controller public class UserController { @Autowired private UserService userService; // 返回JSON数据 @RequestMapping("/user/{id}") @ResponseBody public User getUserById(@PathVariable int id) { return userService.findById(id); } // 返回操作状态 @PostMapping("/update") @ResponseBody public Map<String, Object> updateUser(@RequestBody User user) { boolean success = userService.update(user); return Map.of("status", success ? 200 : 500); } } ``` ### 五、最佳实践 1. RESTful接口建议直接使用`@RestController`替代`@Controller` 2. 复杂场景可自定义消息转换器(如Fastjson) 3. 配合Spring Boot时默认集成Jackson,无需额外配置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值