返回信息问题

返回信息问题

http://img1.sycdn.imooc.com//climg/5f49af7f099d7ef417530679.jpg

@GetMapping("/register")
@ResponseBody    //sevlet的两个直接

if (password.length() < 8) {
   System.out.println(ApiRestResponse.error(ImoocMallExceptionEnum.PASSWORD_TOO_SHORT));
   return ApiRestResponse.error(ImoocMallExceptionEnum.PASSWORD_TOO_SHORT);
}


如图所示,为什么 我修改了 toString 方法的描述  比如将 status 改成  aaaaastatus  等等,,在sout方法中都可以看见修改了   但在响应中  居然自动修复好了????   明明都是返回同样的对象,都是同样调用 toString方法,为什么在响应那里会完全不同,连前面的APIResponse字符串也屏蔽了 想不明白   ( 这是课程的一开始,没看见使用filter  )

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

7回答
MachiAngel 2020-12-13 12:45:39

ApiRestResponse 里面的 toString 你改aaaa 然后印出来  跟 return 响应给前端 根本两件事情...

  • 同学你好,同学的理解是正确的。

    祝学习愉快~

    2020-12-14 09:37:35
好帮手慕阿慧 2020-08-30 16:20:00

同学你好,视频11:55处的错误跟之前返回{"status":"400", "path":"/register",等}类似。500是服务器内部错误,程序在运行过程中出现了错误,而我们没有对这个异常进行进行处理,所以这时Springboot框架就会返回相应的错误信息。

在下节课程4-5自定义异常类小节 中对异常进行了统一处理,统一返回APIResponse对象,输出3个字段。同学可以先往后面学习。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕阿慧 2020-08-30 10:43:28

同学你好,

1、Spring Boot默认使用Jackson将Controller中返回的对象转换为json。

2、 在课程9:40处老师以Post方式访问localhost:8083/register,返回了

 {"timestamp":"2020-02-29....", "message":"需要传String类型的userName", "status":"400", "path":"/register" 还有其它等等字段} 这是Springboot框架中返回的错误信息,status表示请求的状态。400表示没有找到/register路径,因为没有传入String类型的userName。所以这时程序并不会执行register()中的代码,也就不会返回ApiRestResponse对象。

同学访问/register时,应该传入userName和password参数,这样就会执行register()方法中的代码,返回ApiRestResponse对象了。

访问如下:

http://img1.sycdn.imooc.com//climg/5f4b123609fbf57006760257.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 py_builder #1
    答得挺好的,但你迷惑不了我。 在4-5节 11:55处 url输入 localhost:8083/register?username=mumu&password=12345678456 返回json字符串 {"timestamp":"2020-02-29....", "message":"不允许重名,注册失败", path="/register",error="xxx"还有其它等等字段} 你自己也说了,此时程序是正常运行的,肯定会走 register()函数,那请问 path,timestamp,error这些字段是从哪里来的??
    2020-08-30 10:51:22
好帮手慕阿莹 2020-08-29 15:32:48

同学你好

很抱歉给同学带来不好的学习体验,

1、本项目是老师带着大家从0开始搭建的,过滤器相关内容是在 3-6 小节中讲解的

https://class.imooc.com/lesson/1414#mid=36768  

以及转换成json字符串老师也有在这里讲解哦,在视频的第8分50秒左右

2、

{"status":10004,"msg":"不允许重名","data":null}

这个返回信息  到底是怎么来的?   课程一开始就能得到这东西??

同学说 课程一开始就能得到这东西 是指在哪里一开始就得到这个东西的呢?可以反馈一下具体的时间吗?以便于老师去核实一下,这个第一次出现是4-1小节在api文档中,是开发前事先规定好的。

在开发一个项目之前,会由架构师或者技术比较强的人首先搭起框架,写api等事情。

http://img1.sycdn.imooc.com//climg/5f4a033f09eb208112420841.jpg


3、同学说在浏览器输入地址参数就返回了什么,同学是否是用的是教辅中提供的代码呢?

老师提供的代码是课程中写的代码,同学说的public class GlobalExceptionHandler    在4-6中会进行讲解,是还没有讲到哦。同学用的如果是下图这个代码,这个代码是本章节讲完的代码。

http://img1.sycdn.imooc.com//climg/5f4a040b094fe2b710040772.jpg

同学是不是点错了跳过了哪些视频呢?还是同学先看的代码呢?

同学自己探索的精神很棒,不过也建议同学不要着急,可以跟着视频一起敲一下代码。

如果有什么疑问,也可以随时在问答区提问。老师会帮你一起解决问题的。

祝学习愉快。

  • 提问者 py_builder #1
    public class ApiRestResponse<T> { private Integer status; private String msg; private T data; } 2. url输入 localhost:8083/register?username=123&password=12345678 返回json字符串 {"timestamp":"2020-02-29....", "message":"不允许重名,注册失败",还有其它等等字段} *********这些都是4-5节的内容,没法截图,我直接打出来了************ 3. register()返回的是 ApiRestResponse 对象,,但这个对象里面 根本没有message,timestamp这些字段,请问 4-5节 返回的 json字符串 为什么能有这些字段?? 就是这些东西搞得我很烦,当然我现在基本上都搞懂了,但你们这样玩,很容易坑死那些不会的人
    2020-08-29 16:01:49
  • 好帮手慕阿莹 回复 提问者 py_builder #2
    同学你好,这个老师在4-5节的视频11分50秒左右有说这个问题哦,这个是postman自动进行处理的,4-6中老师会统一处理。老师非常能理解同学遇到不理解的地方焦躁的心情,但是要尽量不要让自己陷入到这种情绪中哦,有问题可以提出来,大家一起解决问题。同学通过自己的努力,也得出了结果,同学很棒的,也是一个学习的过程。不要着急哦。另外,在我要回答中可以添加截图,祝学习愉快。
    2020-08-29 19:02:47
  • 提问者 py_builder 回复 好帮手慕阿莹 #3
    你没懂我的意思。 ApiRestResponse这个类里面只有3个属性 status msg data 而4-5视频中 返回的json字符串里面 居然出现了 timestamp path 等等字段,,这说明什么?? 2种可能 1. 有一些代码没展现出来 2. 这视频可能是拼接的,代码可能改过,ApiRestResponse这个类里面不止3个属性
    2020-08-29 20:23:39
py_builder 提问者 2020-08-29 10:05:47

依旧是同样的问题

我觉得你们这课程真是坑(不动脑子的)新手   都不重0开始   要是没动脑子的人,还以为自己学会了


{"status":10004,"msg":"不允许重名","data":null}

这个返回信息  到底是怎么来的?   课程一开始就能得到这东西??  也不加以说明

   浏览器输入   localhost/register?username123&password=12345678

我打断点调试

首先过了

if (StringUtils.isEmpty(userName))   和  if (password.length() < 8)   

进入   userService.register(userName, password);  

然后进入   userMapper.selectByName(userName)  返回User说明  重名

抛出异常   throw new ImoocMallException(ImoocMallExceptionEnum.NAME_EXISTED)
然后返回被调函数 即   UserController.register()   ,

问题就在这个servlet方法,,它是直接抛出去 给spring框架处理的, 那它最后为什么能捕获到你们自定义的ImoocMallException,并且以json字符串的方式  {"status":10004,"msg":"不允许重名","data":null}  输出??   这些在课程一开始根本没提到,你们到底写了什么代码???  能不能从0开始,真让人烦??

  • 提问者 py_builder #1
    写错了,应该是 【然后返回 【调用函数】 即 UserController.register() 】
    2020-08-29 10:07:38
  • 提问者 py_builder #2
    @ControllerAdvice public class GlobalExceptionHandler 所有答案都在这个类里面(还是要靠自己看代码,老师都不说的) @ExceptionHandler(ImoocMallException.class) @ResponseBody public Object handleImoocMallException(ImoocMallException e) 自定义的 ImoocMallException在这个方法中被捕获
    2020-08-29 10:38:21
  • 提问者 py_builder #3
    另外自动生成 json字符串 实际和 toString方法没有半点关系, 因为springBoot框架 自动集成了 jackson这个依赖, 当添加上 @Response注解 或者 @RestfulController 且返回一个对象时,自动进行 对象序列化并输出json字符串 (这也是老师没提到的,好在我自己复习过前面的课程,回想了起来)
    2020-08-29 10:41:09
py_builder 提问者 2020-08-29 09:41:17

在filter包里面看见了

果然是使用了filter ,  原来课程不是从0开始演示的,  我就说视频里面为什么可以直接 转换,直接返回json字符串



  • 你理解的这个filter应该有问题,视频到这一步的时候还没有定义源码里面的 UserFilter。

    2021-02-09 02:38:05
py_builder 提问者 2020-08-29 09:34:39

//servlet的两个注解  (打太快,笔误)

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师