Springboot基本结构——注册 控制层

在控制层,我们要处理的是各种响应,比如各种状态码、状态描述信息等。它们经常会被用到,所以最好是把它们放在一个工具类中封装,并返回给前端浏览器。

我们创建一个utils包,里面有一个JsonResult类,这个就是我们要集中处理的类。

这个类里面有状态码,状态描述信息和数据:

可以看到data的类型是一个泛型。这很正常,因为你也不确定用户要查询的到底是什么类型的数据,它可能多种多样,所以用泛型是最好的选择。

然后就是一些正常的构造方法和get还有set方法:

 

 

这一部分完成后,就该设计请求了,其目的是将用户数据发送到数据库,其实就是向后端发送请求。

对于请求,首先规划的就是请求路径。只要是注册的请求,全部都应该是/users/register这个路径。

更多请求的设计详情请看下面:

 

 

 

设计完请求现在就应该处理请求了。这是控制层应该要干的事,所以现在我们创建一个controller包并在里面创建一个基本的控制类:

 1 //控制层类的基类
 2 public class BaseController {
 3     //操作成功的状态码
 4     public static final int OK = 200;
 5 
 6     //请求处理方法,这个函数的返回值就是需要传递到前端的数据
 7     //自动将异常对象传递到此方法的参数列表上
 8     @ExceptionHandler(ServiceException.class)  //统一处理抛出的异常
 9     public JsonResult<Void> handleException(Throwable e) {
10         JsonResult<Void> result = new JsonResult<>(e);
11         if (e instanceof UsernameDuplicatedException) {
12             result.setState(4000);
13             result.setMessage("用户名已经被占用");
14         } else if (e instanceof InsertException) {
15             result.setState(5000);
16             result.setMessage("注册时产生未知的异常");
17         }
18         return result;
19     }
20 }

这个类也是控制层的基类。

可以注意到这里有一个ExceptionHandler的注解,这个注解用来统一处理抛出的异常。现在问题来了,到底什么样类型的异常呢?我们业务层的功能之一是处理异常,基类是ServiceException,那这个注解的参数列表就给个这个ServiceException.class就好了。

此时这个方法就成了请求处理方法,其返回值就是要传递给前端的数据。

现在创建一个UserController类:

@RestController //直接返回一个对象
@RequestMapping("users")
public class UserController extends BaseController {
    @Autowired
    private IUserService userService;

    @RequestMapping("register")
    public JsonResult<Void> register(@RequestBody User user) {
        //参数里面有一个RequestBody注解,这个可以把前台的json对象转成后台的java对象
        userService.register(user);
        return new JsonResult<>(OK);
    }
}

这个类要继承BaseController类。你会注意到还有一个RequestMapping注解,这个注解就是标识一个类,设置映射请求的请求路径的初始信息。

还有一个RestController注解,意思是它的作用相当于Controller和RequestBody这两个注解,但在实际测试过程中(我用的是postman)效果并不好,所以就还是加了RequestBody这个注解。

我们控制层是处理请求,处理啥请求?用户的注册请求。这个最开始是在哪里定义的?是在业务层。所以我们定义一个IUserService类型的对象就好了,在这里直接调用它的register方法。

现在来分析一下为什么在这里我们需要这个控制层的基类。其实也可以不要,但是需要在UserController里面编写异常的处理方法。这只是一个UserController,如果有其他很多这样的需要编写异常处理方法的类怎么办?那岂不是每个类里面都要写一个这样的处理逻辑?太麻烦了,所以索性写一个专门的类来处理,后续要用到的话直接继承过来就好,所以这就是BaseController的由来。

 

posted @ 2022-09-06 18:56  EvanTheBoy  阅读(163)  评论(0编辑  收藏  举报