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回答
同学你好,启动类所在的包需要和全局异常处理类所在包的保持一致,或者是全局异常处理类所在包子集。
全局异常处理的包是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"})
祝:学习愉快~
好帮手慕阿满
2020-11-18
同学你好,问一下同学没有用户名时,可以正常返回如下类型的错误提示吗?
注册重名的用户时,同学控制台是否有输出“不允许重名”呢?建议同学反馈一下。
另外建议同学将User模块的启动类UserApplication放在com.example.cloud.mall的包下再试试,如果还是不可以,建议同学将User模块项目结构展开贴一下。
祝学习愉快!
相似问题