Postman测试返回500错误

来源:4-6 用户模块测试

weixin_慕勒4393907

2020-11-18 17:20:51

# 具体遇到的问题
首先,按照老师的步骤把用户和公共模块整合到了一起,没有异常的用户模块已经测试成功。但是用Postman测试注册相同用户名,没有提示,只有500错误的提示。


现在已知,从Controller中直接返回的ApiResponse对象没有问题

return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);

可以正常显示“没有用户名”等异常

但是从Service中

throw new ImoocMallException(ImoocMallExceptionEnum.NAME_EXIST);

就会出现所说的问题,最终响应500错误



断点打在GlobalExceptionHander拦截ImoocMallException的方法内部,发现根本没有进入该方法的执行

@ExceptionHandler(ImoocMallException.class)
@ResponseBody
public ApiRestResponse handleImoocMallException(ImoocMallException e) {
//打印日志
   log.error("ImoocMallException: " + e);
   //拦截到异常后返回Response信息
   return ApiRestResponse.error(e.getCode(), e.getMsg());
}

# 报错信息的截图

{

"timestamp": "2020-11-18T09:12:04.301+0000",

"status": 500,

"error": "Internal Server Error",

"message": "No message available",

"path": "/register"

}


# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

package com.example.cloud.mall.exception;


import com.example.cloud.mall.common.ApiRestResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

//统一异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

   @ExceptionHandler(Exception.class)
@ResponseBody
   public ApiRestResponse handleException(Exception e) {
log.error("Default Exception: " + e);
       return ApiRestResponse.error(ImoocMallExceptionEnum.SYSTEM_ERROR);
   }

//拦截ImoocMallException异常
   @ExceptionHandler(ImoocMallException.class)
@ResponseBody
   public ApiRestResponse handleImoocMallException(ImoocMallException e) {
//打印日志
       log.error("ImoocMallException: " + e);
       //拦截到异常后返回Response信息
       return ApiRestResponse.error(e.getCode(), e.getMsg());
   }

//对于Valid参数校验失败后的异常处理
   @ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
   public ApiRestResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
log.error("MethodArgumentNotValidException: " + e);
       return handleBindingResult(e.getBindingResult());
   }

private ApiRestResponse handleBindingResult(BindingResult bindingResult) {
//把异常处理为对外暴露的提示
       List<String> list = new ArrayList<>();
       if (bindingResult.hasErrors()) {
List<ObjectError> allErrors = bindingResult.getAllErrors();
           for (ObjectError objectError : allErrors) {
String defaultMessage = objectError.getDefaultMessage();
               list.add(defaultMessage);
           }
}
if (list.size() == 0) {
return ApiRestResponse.error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR);
       }
return ApiRestResponse.error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR.getCode(), list.toString());
   }

}



package com.example.cloud.mall.user.service.impl;

import com.example.cloud.mall.exception.ImoocMallException;
import com.example.cloud.mall.exception.ImoocMallExceptionEnum;
import com.example.cloud.mall.user.model.dao.UserMapper;
import com.example.cloud.mall.user.model.pojo.User;
import com.example.cloud.mall.user.service.UserService;
import com.example.cloud.mall.util.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.security.NoSuchAlgorithmException;

@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
   UserMapper userMapper;

   @Override
   public void register(String username, String password) throws ImoocMallException, NoSuchAlgorithmException {
//检验是否有重名
       User user = userMapper.selectByName(username);
       if (user != null) {
throw new ImoocMallException(ImoocMallExceptionEnum.NAME_EXIST);
       }
//插入用户数据

       User newUser = new User();
       newUser.setUsername(username);
       newUser.setPassword(MD5Utils.getMD5(password));
//        newUser.setPassword(password);

       int count = userMapper.insertSelective(newUser);
       if (count == 0) {
throw new ImoocMallException(ImoocMallExceptionEnum.INSERT_FAILED);
       }
}

@Override
   public User login(String userName, String password) throws NoSuchAlgorithmException, ImoocMallException {
String passwordMd5 = MD5Utils.getMD5(password);
       User user = userMapper.selectLogin(userName, passwordMd5);
       if (user == null) {
throw new ImoocMallException(ImoocMallExceptionEnum.LOGIN_FAILED);
       }
return user;
   }

@Override
   public void updateInformation(User user) throws ImoocMallException {
int count = userMapper.updateByPrimaryKeySelective(user);
       if (count > 1) {
throw new ImoocMallException(ImoocMallExceptionEnum.UPDATE_FAILED);
       }
}

@Override
   public Boolean checkAdminRole(User user){
return user.getRole().equals(2);
   }
}




package com.example.cloud.mall.exception;

//异常枚举
public enum ImoocMallExceptionEnum {
NEED_USER_NAME(10001,"用户名不能为空"),
   NEED_PASSWORD(10002,"密码不能为空"),
   PASSWORD_TOO_SHORT(10003,"密码不能小于8位"),
   NAME_EXIST(10004,"不允许重名"),
   INSERT_FAILED(10005,"插入失败"),
   LOGIN_FAILED(10006,"用户名或密码错误"),
   NEED_LOGIN(10007,"用户未登陆"),
   UPDATE_FAILED(10008,"更新失败"),
   NEED_ADMIN(10009,"无管理员权限"),
   NAME_NOT_NULL(10010,"参数不能为空"),
   CREATE_FAILED(10011,"新增失败"),
   REQUEST_PARAM_ERROR(10012,"参数错误"),
   DELETE_FAILED(10013,"删除失败"),
   MAKE_DIR_FAILED(10014,"文件夹创建失败"),
   UPLOAD_FAILED(10015,"图片上传失败"),
   NOT_SALE(10016,"商品状态不可售"),
   NOT_ENOUGH(10017,"商品库存不足"),
   CART_EMPTY(10018,"购物车已勾选的商品为空"),
   NO_ENUM(10019,"未找到对应的枚举类"),
   NO_ORDER(10020,"订单不存在"),
   NOT_YOUR_ORDER(10021,"订单不属于你"),
   WRONG_ORDER_STATUS(10021,"订单状态不符"),
   SYSTEM_ERROR(20000,"系统异常");

   Integer code;
   String msg;

   ImoocMallExceptionEnum(Integer code, String msg) {
this.code = code;
       this.msg = msg;
   }

public Integer getCode() {
return code;
   }

public void setCode(Integer code) {
this.code = code;
   }

public String getMsg() {
return msg;
   }

public void setMsg(String msg) {
this.msg = msg;
   }

@Override
   public String toString() {
return "ImoocMallExceptionEnum{" +
"code=" + code +
", msg='" + msg + '\'' +
'}';
   }
}



package com.example.cloud.mall.common;

import com.example.cloud.mall.exception.ImoocMallExceptionEnum;

//统一响应对象,根据文档设置响应对象的属性
public class ApiRestResponse<T> {
private Integer status;
   private String msg;
   private T data;

   private static final Integer OK_CODE = 10000;
   private static final String OK_MSG = "SUCCESS";

   public ApiRestResponse(Integer status, String msg, T data) {
this.status = status;
       this.msg = msg;
       this.data = data;
   }

public ApiRestResponse(Integer status, String msg) {
this.status = status;
       this.msg = msg;
   }

public ApiRestResponse() {
this(OK_CODE, OK_MSG);
   }

public static <T> ApiRestResponse<T> success() {
return new ApiRestResponse<>();
   }

public static <T> ApiRestResponse<T> success(T result){
ApiRestResponse<T> apiRestResponse = new ApiRestResponse<>();
       apiRestResponse.setData(result);
       return apiRestResponse;
   }

public static <T> ApiRestResponse<T> error(Integer code, String msg) {
return new ApiRestResponse<>(code, msg);
   }

public static <T> ApiRestResponse<T> error(ImoocMallExceptionEnum ex) {
return new ApiRestResponse<>(ex.getCode(), ex.getMsg());
   }

public static Integer getOkCode() {
return OK_CODE;
   }

public static String getOkMsg() {
return OK_MSG;
   }

public Integer getStatus() {
return status;
   }

public void setStatus(Integer status) {
this.status = status;
   }

public String getMsg() {
return msg;
   }

public void setMsg(String msg) {
this.msg = msg;
   }

public T getData() {
return data;
   }

public void setData(T data) {
this.data = data;
   }
}



​在这里输入代码,可通过选择【代码语言】突出显示

写回答

2回答

好帮手慕阿满

2020-11-19

同学你好,启动类所在的包需要和全局异常处理类所在包的保持一致,或者是全局异常处理类所在包子集。

全局异常处理的包是com.example.cloud.mall.exception,而UserApplication所在的包是com.example.cloud.mall.user,和全局异常处理类所在包不一致,并且不是子集,所以不能正常捕获。将UserApplication移至com.example.cloud.mall包下即可正常捕获。

或者在UserApplication类上增加如下@ComponentScann注解,指明类所在包也可以正常捕获,如:

@ComponentScan({"com.example.cloud.mall.user","com.example.cloud.mall.common"})

http://img.mukewang.com/climg/5fb608970973b54708020247.jpg

祝:学习愉快~

0

好帮手慕阿满

2020-11-18

同学你好,问一下同学没有用户名时,可以正常返回如下类型的错误提示吗?

http://img.mukewang.com/climg/5fb4fe6d09c9259b02100110.jpg

注册重名的用户时,同学控制台是否有输出“不允许重名”呢?建议同学反馈一下。

另外建议同学将User模块的启动类UserApplication放在com.example.cloud.mall的包下再试试,如果还是不可以,建议同学将User模块项目结构展开贴一下。

祝学习愉快!

0
heixin_慕勒4393907
h 把UserApplication放在com.example.cloud.mall包下后解决了问题, 但是请问老师原因是什么?查了半天不知道该怎么解决。
h020-11-19
共1条回复

0 学习 · 16556 问题

查看课程