spring MVC实践需要注意的地方

作者:吃水果毫不费力zz 时间:2023-02-07 00:33:07 

目录
  • 请求参数校验:

    • 对于url中的参数

    • 对于request body请求体中的参数

  • 响应数据格式:

    • 全局异常处理

      • 统一定义异常响应码,便于查看

        使用spring mvc提供restful风格的接口,实现前后端分离,后端只提供数据接口,而不做页面渲染。因此可对接口做统一处理:

        1. 请求参数校验

        2. 响应数据格式

        3. 全局异常处理

        通过以上统一处理,开发人员可专注于业务处理,把校验,异常响应的逻辑分离出来。

        请求参数校验:

        对于url中的参数

        • 如果添加@RequestParam,但没有传递该参数,则抛出MissingServletRequestParameterException异常

        • 如果添加@Max等注解,同时不满足该条件,抛出ConstraintViolationException 或BindException异常

        对于request body请求体中的参数

        • Bean前添加@RequestBody,如果没有请求体,抛出HttpMessageNotReadableException异常

        • 在bean前添加@Validate注解,bean中属性添加@Max,@NotNull等注解,即对响应属性进行校验,如果不满足,抛出MethodArguementNotValidException

        • @Validate内可添加group,表明需要校验的操作,@Max可添加groups,当groups包含group时,则进行校验。

        • Bean中也可自定义注解,通过实现ConstraintValidator接口自定义校验逻辑。如果校验失败,会抛出MethodArgumentNotValidException异常,

        这些异常都被全局异常处理拦截,返回异常信息。

        响应数据格式:

        • 建立统一响应类JsonResp<T>,泛型T为业务响应内容,可为String,List,java bean等。定义属性result表明响应是否成功,响应码code,响应码信息msg。这里code及msg与全局异常处理的响应枚举类相对应。

        • 定义ResponseBodyhandler实现ResponseBodyAdvice接口,当响应类型为json时,如果响应类型为JsonResp,直接响应给客户端;如果不是,则new JsonResp,将响应体set进去,响应给客户端。

        • 在controller的方法返回类型可任意定义String,List,java bean,在ResponseBodyhandler转化为统一JsonResp形式。如果是流文件,则直接返回不会转化为JsonResp形式。这样可将响应包装成统一的JsonResp数据格式,便于前端处理。

        全局异常处理

        • 建立响应枚举类ResponseEnum,定义业务需要的响应码及响应码信息

        • 建立自定义异常类BaseException,继承运行时异常RuntimeException,初始化时设置ResponseEnum。

        • 建立异常捕捉类GlobalExceptionAspect,类中添加@RestCOntrollerAdvice注解,使用@Exceptional捕捉参数校验异常和自定义异常BaseException。

        • 最外层捕捉Exception,捕捉未定义的异常

        • 如果遇到业务报错,throw new BaseException(ResponseEnum.xxx),抛出自定义异常,该异常由GlobalExceptionAspect切面捕捉,统一响应至客户端

        统一定义异常响应码,便于查看

        避免在业务代码里进行异常的响应,简化代码

        这些统一处理的本质是使用fliter或者aop拦截请求和响应参数进行通用逻辑处理,因此,可对请求进行敏感词过滤,参数加解密等处理,解耦业务逻辑。

        来源:https://segmentfault.com/a/1190000039330441

        标签:spring,MVC,实践
        0
        投稿

        猜你喜欢

      • 详解Java接口签名(Signature)实现方案

        2022-02-05 09:28:57
      • Unity3D实现人物转向与移动

        2022-10-28 08:42:13
      • Java与Node.js利用AES加密解密出相同结果的方法示例

        2021-09-11 21:06:58
      • Android获取手机通讯录、sim卡联系人及调用拨号界面方法

        2021-07-02 00:41:07
      • Spring整合CXF webservice restful实例详解

        2023-03-20 09:58:21
      • 基于WPF实现绘制地铁路线图

        2023-09-08 13:23:12
      • 简单分析Java的求值策略原理

        2022-03-22 19:14:00
      • 详解spring boot rest例子

        2021-06-02 21:54:46
      • Android实现列表元素动态效果

        2021-07-18 07:05:22
      • Struts2之Validator验证框架的详细介绍

        2023-09-08 14:46:05
      • Java毕业设计实战之平行志愿管理系统的实现

        2023-09-12 14:34:23
      • Android线性布局与相对布局的实现

        2021-07-26 09:08:01
      • C#泛型详解及关键字作用

        2023-04-07 20:23:12
      • SpringBoot整合Shiro框架,实现用户权限管理

        2021-10-27 00:03:02
      • Android巧用ActionBar实现下拉式导航

        2023-12-02 04:00:59
      • Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】

        2023-01-09 11:08:31
      • C#实现计算器窗体程序

        2023-04-09 01:25:42
      • java和javascript中过滤掉img形式的字符串不显示图片的方法

        2021-08-31 10:12:49
      • 详解Java token主流框架之JWT

        2022-03-30 19:30:34
      • Java以命令模式设计模式

        2023-11-24 21:27:52
      • asp之家 软件编程 m.aspxhome.com