1. 创建响应
状态码、状态描述信息、数据,这部分功能封装到一个类中,将这个类作为方法返回值,返回给前端浏览器。
package com.cy.store.utils;
import lombok.Data;
import java.io.Serializable;
@Data
public class JsonResult<E> implements Serializable {
//状态
private Integer state;
//状态信息
private String message;
//数据
private E data;
public JsonResult() {
}
public JsonResult(Integer state) {
this.state = state;
}
public JsonResult(Throwable e) {
this.message = e.getMessage();
}
public JsonResult(Integer state, E data) {
this.state = state;
this.data = data;
}
}
2. 编写一个BaseController类,统一处理异常
当前项目中产生的异常,会被统一拦截到此方法中,这个方法此时充当了请求处理方法,方法的返回值直接给到前端。
package com.cy.store.controller;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.ServiceException;
import com.cy.store.service.ex.UserDuplicatedException;
import com.cy.store.utils.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
//控制层类的基类
@RestController //@Controller + @ResponseBody
public class BaseController {
public static final int OK = 200;
//自动将异常对象传递给此方法的参数列表上
//当前项目中产生的异常,会被统一拦截到此方法中,这个方法此时充当了请求处理方法,方法的返回值直接给到前端
@ExceptionHandler(ServiceException.class) //用于统一处理抛出的异常
public JsonResult handleException(Throwable e) {
JsonResult<Object> jsonResult = new JsonResult<>(e);
if(e instanceof UserDuplicatedException) {
jsonResult.setState(4000);
jsonResult.setMessage("用户名被占用");
}
if(e instanceof InsertException) {
jsonResult.setState(5000);
jsonResult.setMessage("注册时产生未知的异常");
}
return jsonResult;
}
}
3. UserController类
package com.cy.store.controller;
import com.cy.store.entity.User;
import com.cy.store.service.IUserService;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.UserDuplicatedException;
import com.cy.store.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.cy.store.controller.BaseController.OK;
@RestController
@RequestMapping("users")
public class UserController extends BaseController{
@Autowired
private IUserService userService;
@RequestMapping("/reg")
public JsonResult<Object> regist(User user) {
userService.register(user);
return new JsonResult<>(OK);
// JsonResult<Object> result = new JsonResult<>();
// try {
// userService.register(user);
// result.setState(200);
// result.setMessage("用户注册成功");
// } catch (UserDuplicatedException e) {
// result.setState(4000);
// result.setMessage("用户名被占用");
// }catch (InsertException e) {
// result.setState(5000);
// result.setMessage("注册时产生未知的异常");
// }
// return result;
}
}
4. 测试
- 启动主程序类
- 浏览器中输入:http://localhost:8080/users/reg?username=marry&password=333
注册成功时返回以下数据:
用户名重复时返回以下数据: