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,一经查实,立即删除!

相关文章

java 定义构造器_java的构造器定义以及使用

构造器,是面向对象所特有的概念,是一种特殊的方法,与对象创建有关1、构造器没有返回值类型2、构造器方法名与类名相同,而且可以重载构造器3、构造器不能手动调用,只能在创建对象时自动调用一次4、如果没有在类中定义构…

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如何判断一个文件是否处于打开状态?

请问你的是linux吗&#xff1f;如果是linux可以借助/proc来获取。 import os class File(object): def __init__(self, file_path): if not os.path.exists(file_path): raise OSError({file_path} not exist.format(file_path file_path)) self.file_path os.path.abspath(f…

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 定时器每天就执行一次的实现代码

1.实现功能编写python脚本一直运行&#xff0c;判断当下是否是新的一天&#xff0c;如果是就执行一次任务代码2.具体实现代码#-*-coding:utf-8 -*-__author__ Administratorimport os,threading,timecurTimetime.strftime("%Y-%M-%D",time.localtime())#记录当前时间…

python 类的内置方法_【转】[python] 类常用的内置方法

原文&#xff1a;http://xukaizijian.blog.163.com/blog/static/170433119201111894228877/ 内置方法 说明 __init__(self,...) 初始化对象&#xff0c;在创建新对象时调用 __del__(self) 释放对象&#xff0c;在对象被删除之前调用 __new__(cls,*args,**kwd) 实例的生成操作 _…

java 文件与base64_java之文件与base64字符之间的相互转换

package cn.xuanyuan.util;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class FileUitl {/*** 将文件转成base64 字符串* param path文件路径* return ** thro…

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

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

java 父子线程 调用链_ZipKin原理学习--Zipkin多线程及线程池中追踪一致性问题解决...

在学习Zipkin分布式追踪系统中我们了解到Trace在整个调用链是一致的&#xff0c;在web服务中可以通过在header设置Trace值在不同的服务中进行传递&#xff0c;那样在一个服务内部不同的线程&#xff0c;甚至是线程池中Zipkin是如何处理的&#xff0c;接下来我们来了解学习一下。…

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标注审核_Python类型标注

机器学习越来越火&#xff0c;大量的机器学习包都支持Python&#xff0c;导致了Python近几年非常火爆&#xff0c;入手门槛低&#xff0c;编程简单&#xff0c;概念非常少。越来越多的新手小白加入到Python编程。 Python虽然简单&#xff0c;但也带来很多问题。尤其是弱类型一直…

php的在线问卷调查_基于php技术的问卷调查系统

本系统前台主要使用php作为开发语言&#xff0c;后台使用mysql作为数据库管理系统&#xff0c;开发环境是wamp&#xff0c;服务器采用apache。系统的主要功能包括&#xff1a;管理登陆、问卷调查题目及内容选项的添加、修改和查询&#xff0c;调查结果统计等。分为管理员用户、…

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一个对象就可以…