使用@ResponseBody的一些问题以及解决方法

@ResponseBody&@RequestBody

@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
@ResponseBody该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。
由于json传递信息的方便性,用于传递json数据上的比较多。

使用@ResponseBody和@RequestBody需要引入两个包
jackson-core-asl,和 jackson-mapper-asl
附下载地址:http://download.csdn.net/detail/czxt0605/7677923

可以在Controller中将json格式字符串转换成java对象、String。
以下为例:

@RequestMapping("/newDormInfo")
public @ResponseBody Info newDormInfo(@RequestBody Info info) throws Exception {
        System.out.println(Info);
}
  • 如果在这个Controller某个方法中使用这两个注解的话,@RequestBody放在参数列表中你想要将json格式数据转化为相应Java对象的参数的前面;@ResponseBody则放在这个方法的前面。
@Controller
@ResponseBody
public class Login{
    @RequestMapping("/userLogin")   //设置结果编码,在response之后
    public String userLogin(HttpServletRequest request,HttpServletResponse response) throws Exception{
}
  • 如果在整个Controller中都想要返回数据为json格式的话,可以这样如上将@ResponseBody注解写在代码体之外

我遇到的一些问题

我们了解到,@ResponseBody可以将数据转化为json格式返回,而今天同学给我的接口的返回数据是jsonObj格式的,我就在想,既然String,java类对象都能转化为json格式输出,那这样的转化岂不是更方便?代码如下:

@RequestMapping("/newDormInfo")
public @ResponseBody JSONObject getDormInfo(HttpSession session) {

        if (session.getAttribute("userid") == null) {
            System.out.println(StudentUtil.get_dormitory_info(studentid,String.valueOf(new Date().getTime()),token));
            return StudentUtil.get_dormitory_info(studentid,String.valueOf(new Date().getTime()),token);
        }
        return null;
    }
  • 返回数据类型设置的是JSONObject ,并且使用了@ResponseBody 注解,然而运行之后报错
 Could not write JSON: Object is null (through reference chain: net.sf.json.JSONObject["xb"]->net.sf.json.JSONNull["empty"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Object is null (through reference chain: net.sf.json.JSONObject["xb"]->net.sf.json.JSONNull["empty"])
 //谷歌翻译过来就是
 无法写入JSONObjectnull(通过引用链:net.sf.json.JSONObject [“xb”] - > net.sf.json.JSONNull [“empty”]); 嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:Objectnull(通过引用链:net.sf.json.JSONObject [“xb”] - > net.sf.json.JSONNull [“empty”])
  • 在之前的代码中通过打印知道,首先我的数据并不是为空,那么这个问题出在嵌套异常上,在转化的过程中出错,也就是说,通过注解将JSONObject 的数据转化为json格式数据失败,或者说,无法转化。

于是我就换了一种返回数据类型,String,然而,又遇到了另一个问题,换成String格式之后,返回到前端的数据的确是json格式了,然而其中的中文全部变成了 问号?
有病乱投医,查了许多资料却不得要领,我在返回之前用几个方式将数据转化为了utf-8格式,然而到前端之后还是问号,好气哦。
静下来想一想,会不会不是我的问题,而是@RepsonseBody的问题,也就是说无论我在返回之前作何编码方式编码,它在返回的时候都会重新编码?依着这条思路找到了答案

这可以说是spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list则使用MappingJacksonHttpMessageConverter,返回string,则使用StringHttpMessageConverter,这个convert使用的是字符集是iso-8859-1,而且是final的。

引自:http://blog.csdn.net/hurryjiang/article/details/7710110

那,也就是说在返回之前,我们的数据被编码成了iso-8859-1的格式,前端编码格式不一致,导致乱码。
有很多解决办法,而一位博主的解决方法最是简单有效:

解决返回中文乱码的问题有两种,第一种是局部的,只针对于某个方法的返回进行处理,第二种是全局的,针对于整个项目,如下:
第一种:在@RequestMapping中添加produces=”text/html;charset=UTF-8,如:

@RequestMapping(value="/login.do",method=RequestMethod.POST,produces="text/html;charset=UTF-8")
    @ResponseBody
    public String login(@RequestParam(value="username") String userName,@RequestParam(value="password") String password){
        return JSONMessageUtil.getSuccessJSON("登录成功");
    }
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
@ResponseBody 注解用于将方法的返回值直接作为 HTTP 响应的内容返回给客户端。它通常用于 RESTful API 的开发中,可以方便地将方法的返回值转换为 JSON 或其他格式的数据,并发送给客户端。 当你在使用 @ResponseBody 注解时,如果它在代码中出现了红色波浪线或报错,通常是因为缺少相关的依赖或配置问题。以下是一些可能导致该问题的原因和解决方法: 1. 缺少相关的依赖:确保你的项目中已经引入了 Spring MVC 相关的依赖,例如 spring-webmvc 或 spring-boot-starter-web。 2. 项目配置问题:检查你的项目配置文件(如 application.properties 或 application.yml)中是否正确配置了 Spring MVC 相关的配置项,特别是关于 JSON 格式转换的配置。 3. 控制器类未被正确扫描:确保你的控制器类被正确地扫描和注册到 Spring 容器中。可以通过 @Controller 或 @RestController 注解来标记控制器类,并且确保使用了正确的包扫描配置。 4. 方法签名问题:确保被 @ResponseBody 注解标记的方法具有正确的返回类型。常见的返回类型包括 ResponseEntity、ModelAndView、String(作为视图名称)以及其他对象类型(会自动转换为 JSON)。 5. 配置冲突:如果你同时使用了其他返回值处理方式(如视图解析器),可能会与 @ResponseBody 注解冲突。在这种情况下,可以考虑使用@RestController 注解替代 @Controller 注解。 如果以上方法都无法解决问题,建议提供更多的错误信息或代码片段,以便更好地帮助你解决问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值