java spring mvc api_SpringMVC实现REST API

JSON

使用Jackson jar包、@RequestBody、@ResponseBody注解,达到:

1. 请求JSON消息体映射为JAVA对象

2. 返回JAVA对象映射为JSON消息体

Step 1. 导入Jackson jar包:

209cfb3407d410dd79162a900791f615.png

Step 2. 在Spring MVC配置中加入annotation-driven,该配置可以确保@RequestBody、@ResponseBody、@Valid(用于请求校验)注解可以被解析生效:

3640b33b0e607f6873aad44870aa0b6f.png

Step 3. 配置控制器扫描路径:

511bd2a0fb06701dde110ade619483e6.png

Step 3. 此时编写Controller,使用@RequestBody、@ResponseBody注解:

9f0664d6b22b329444ff004822b6039e.png

请求校验

请求校验一般包含两个方面的校验:

1. 请求参数的合法性校验,例如格式校验

该类校验可通过在类定义时使用JSR 303进行数据校验,可使用Hibernate Validator,当数据校验有问题时,将会抛出org.springframework.web.bind.MethodArgumentNotValidException。

2. 业务逻辑校验,例如系统规定网上店铺不可重名

该类校验,一般通过定制业务规则校验代码实现,可抛出自定义异常。

Step 1. 导入Hibernate Validator jar包:

71e478e207ba55f46b4f204788422e56.png

Step 2. 在REST API交互使用到的类定义中使用JSR 303数据校验注解,例如:

02f8de15ab22fa92ed95ee04ad695185.png

HTTP Status Code

1. 在Controller的目标方法上通过@ResponseStatus定义成功码,例如需要PUT方法成功时返回204而不是200:

57f54979fb1b84ff99e3533319dba85c.png

2. 对于通过定制的业务逻辑校验抛出自定义异常的场景,可以在自定义异常类上加上@ResponseStatus定义Status Code,例如:

fbebc9563d557464282a93632c6ab949.png

3. 对于JSR 303进行的数据校验,返回的是400 Bad Request异常,这个一般无需额外定制。

4. 由于本例中要实现:

当异常出现时,需要返回具体的错误提示信息给客户端(见“自定义错误”章节),实际上异常发生时返回的HTTP Status Code也是在该章节的自定义ExceptionHandler类中指定的。

自定义错误

由于HTTP Status Code只能给出一个笼统的错误提示,往往在实际项目中,当错误发生时,需要根据不同的错误返回不同的错误信息,一般包含错误码和错误描述。

对于业务规则校验抛出的自定义异常和JSR 303抛出的MethodArgumentNotValidException,可以定制ExceptionHandler类来进行处理,在其中直接返回自定义的ErrorInfo对象或者通过返回Map的方式实现:

648a518e06ce64953c71a0de1fadb7c6.png

在上例中,在对应的方法上也加上了@ResponseStatus指定了返回的HTTP Status Code,实际上自定义异常类中使用@ResponseStatus注解标识的HTTP Status Code和JSR 303数据校验未通过时设定的HTTP Status Code,都会在此处被覆盖,如果在此处不设置@Response Status,很不幸将会默认返回表示正确的HTTP Status Code,例如200。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了

前言当我们的网关Gateway程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问,网关是对客户端的入口与出口&…

json里面的list数据取不出来_sql盲注的困局:利用DNSlog快速导出数据

对于一个sql注入点来说最幸运的就是支持堆叠注入&#xff0c;最蛋疼的就是盲注&#xff0c;盲注里面难搞的就是基于时间的盲注。我们在本地利用这段代码进行演示<?php error_reporting(0); $link mysqli_connect(localhost,root,root); mysqli_set_charset($link,utf8); m…

python怎么测试程序_python如何测试程序

测试函数是用于自动化测试&#xff0c;使用python模块中的unittest中的工具来测试 附上书中摘抄来的代码&#xff1a;#codingutf-8 import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): f…

判定覆盖白盒测试java_白盒测试系列(四)条件判定覆盖

条件判定覆盖一、定义&#xff1a;程序中每个判定至少有一次为真值&#xff0c;有一次为假值,使得程序中每个分支至少执行一次&#xff0c;且使得各判定中的每个条件获得各种可能的取值至少满足一次。二、特点&#xff1a;1、综合了条件覆盖和判定覆盖的特点2、满足条件判定覆盖…

discard python_Netty入门教程(一) 实现DISCARD服务

官方那个给出的介绍是&#xff1a;Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。然后我们简单理解一下&#xff0c;这玩意就是个程序&#xff0c;干什么的&am…

python向量化编程技巧_神经网络基础之Python与向量化

Vectorization 深度学习算法中&#xff0c;数据量很大&#xff0c;在程序中尽量减少使用loop循环语句&#xff0c;而可以使用向量运算来提高程序运行速度。 向量化(Vectorization)就是利用矩阵运算的思想&#xff0c;大大提高运算速度。例如下面所示在Python中使用向量化要比使…

SQL server 数据库面试题及答案(实操2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

python电子相册制作软件_电子相册怎么做

电子相册制作 本文来自#千兆网络有什么用#征稿活动&#xff0c;不断提速的网络给你的生活带来了什么变化&#xff1f;快来参与活动&#xff0c;聊聊你玩转互联网&#xff0c;高速网上冲浪的经历&#xff01;>点击这里查看活动详情< 现在手机的拍照功能日趋强大&#xff0…

java list 范围删除_JAVA中循环删除list中元素(移除list两时间范围外的元素)

印象中循环删除list中的元素使用for循环的方式是有问题的&#xff0c;但是可以使用增强的for循环&#xff0c;然后今天在使用时发现报错了&#xff0c;然后去科普了一下&#xff0c;再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。。JAVA中循环遍历…

python reduce函数_Python reduce()函数的用法小结

reduce()函数也是Python内置的一个高阶函数。 reduce() 格式&#xff1a; reduce (func, seq[, init()]) reduce()函数即为化简函数&#xff0c;它的执行过程为&#xff1a;每一次迭代&#xff0c;都将上一次的迭代结果&#xff08;注&#xff1a;第一次为init元素&#xff0c;…

Php获取id并提交表单,提交表单后 PHP获取提交内容的实现方法

提交表单后 PHP获取提交内容的实现方法2020-06-14 15:35:24问题&#xff1a;网页上提交表单之后&#xff0c;PHP为什么不能获取提交的内容&#xff1f;然而在老版本的PHP上运行却正常。新版的PHP已经废弃了原来的表单内容处理方式&#xff0c;即不再把提交的表单的内容直接复制…

idea查看一个类的所有子类_java new一个对象的过程中发生了什么

java在new一个对象的时候&#xff0c;会先查看对象所属的类有没有被加载到内存&#xff0c;如果没有的话&#xff0c;就会先通过类的全限定名来加载。加载并初始化类完成后&#xff0c;再进行对象的创建工作。我们先假设是第一次使用该类&#xff0c;这样的话new一个对象就可以…

stringbuilder删除最后一个字符_Java类-StingBuffer,StringBuilder

Java提供了String,StringBuffr,StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法.他们的相同点都是封装字符串;都实现了CharSeqence接口.public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable,CharSequncepublic f…

docker 删除所有镜像_Docker常用命令

&#xfeff;docker 常用命令#查看 Docker 版本 docker version #从 Docker 文件构建 Docker 镜像 docker build -t image-name docker-file-location#运行 Docker 镜像 docker run -d image-name#查看可用的 Docker 镜像 docker images#查看最近的运行容器 docker ps -l#查看所…

php制作学生卡片,PHP基础案例一:展示学生资料卡

一、需求分析&#xff1a;请利用PHP的变量保存学生的姓名、出生日期、所属学科以及学号&#xff0c;最后将该学生的信息输出到网页中显示。其中&#xff0c;在定义学生的出生日期和学号时候&#xff0c;必须满足以下两个条件。1、出生日期为公历&#xff0c;填写格式为YYYY-MM-…

element label动态赋值_基于Element封装可拖动放大缩小的弹窗

ElementUI 自带的对话框组件(el-dialog)没有拖动和最小化的处理&#xff0c;目前业务遇到呼叫弹屏处理&#xff0c;基于el-dialog 再次进行封装下&#xff0c;上篇文章有人说图片换成代码就好了&#xff0c;下面代码部分我就直接放代码了&#xff0c;不再用图片处理了。先看看效…

eeg数据集_运动想象,情绪识别等公开数据集汇总

本文来自脑机接口社区运动影像数据Left/Right Hand MI: http://gigadb.org/dataset/100295Motor Movement/Imagery Dataset: https://www.physionet.org/physiobank/database/eegmmidb/Grasp and Lift EEG Challenge: https://www.kaggle.com/c/grasp-and-lift-eeg-detection/d…

excel批量删除公式保留数据_Excel实用tips(17) – 批量删除隐藏的工作表

大家可能遇到过这种情况&#xff1a;一个几经易手的远古 Excel 表&#xff0c;文件巨大无比&#xff0c;运行极慢&#xff0c;删除数据和公式也无济于事。反复查找原因&#xff0c;才发现表格中有好几十个隐藏的 worksheet&#xff0c;这些 worksheet 大多都是一些草稿表&#…

docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像

一个只用markdown语法编写文章的90后野路子Web架构师&#xff0c;每天都分享一些有用的知识点&#xff0c;欢迎关注&#xff5e;前言概述本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上&#xff0c;以及如何使用镜像加速器来提升获取Docker官方镜像的速度。名…

java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法

首先还是要了解框架JFrame中的层次结构。JFrame中的层次分布及相对关系是:最底层是&#xff1a;JRootPane&#xff1b;第二层是&#xff1a;JlayerPane&#xff1b;最上层就是ContentPane,也正是我们常说的内容面板。所以一般我们拖放的控件就是在ContentPane层上。有了这些常识…