SpringBoot 之设计API接口实现统一格式返回

SpringBoot RESTful API返回统一数据格式还不懂? 关于 Spring 的全局处理,我有两方面要说: 统一数据返回格式 统一异常处理为了将两个问题说明清楚,将分两个章节分别说明,本章主要说第一点 有童鞋说,我们项目都做了这种处理,就是在每个 API 都单独工具类将返回值进行封装,但这种不够优雅;我想写最少的代码完成这件事,也许有童鞋说,加几个注解就解决问题了,说的没错,但这篇文章主要是为了说明为什么加了几个注解就解决问题了,目的是希... 阅读详情

前言

在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式。
前后端的工作职责越来越明确。

一般系统的大致整体架构图如下:
在这里插入图片描述

接口交互

前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端。

返回格式

后端返回给前端我们一般用JSON体方式,定义如下:

{
  #返回状态码
  code:integer,
  #返回信息描述
  message:string,
  #返回值
  data:object
}

CODE状态码

code返回状态码可以参考HTTP请求返回的状态码来设计,这样的好处就把错误类型归类到某个区间内。

#1000~1999 区间表示参数错误
#2000~2999 区间表示用户错误
#3000~3999 区间表示接口异常

这样前端开发人员在得到返回值后,根据状态码就可以知道,大概什么错误,再根据message相关的信息描述,可以快速定位。

Message信息提示

错误信息提示。一般和code状态码一起设计,如:

public enum ResultCode {
	/*成功状态码*/
	SUCCESS(1, "成功"),
	SYSTEM_ERROR(400, "系统繁忙,请稍后重试"),
	/*参数错误: 1001-1999 */
	PARAM_IS_INVALID(1001, "参数无效"),
	PARAM_IS_BLANK(1002, "参数为空"),
	PARAM_TYPE_BIND_ERROR(1003, "参数类型错误"),
	PARAM_NOT_COMPLETE(1004, "参数缺失"),
	/*用户错误: 2001-2999*/
	USER_NOT_LOGGED_IN(2001, "用户未登录,访问的路径需要验证,请登录"),
	USER_LOGIN_ERROR(2002, "账号不存在或密码错误"),
	USER_ACCOUNT_FORBIDDEN(2003, "账号已被禁用"),
	USER_NOT_EXIST(2004, "用户不存在"),
	USER_HAS_EXISTED(2005, "用户已存在");
	
	private Integer code;
	private String message;
	
	ResultCode(Integer code, String message) {
		this.code = code;
		this.message = message;
	}
	
	public Integer code() {
		return this.code;
	}
	
	public String message(){
		return this.message;
	}
}

Data数据体

返回数据体,JSON格式,返回体类Result。

// 成功结果实体
@Data
public class Result implements Serializable {

	private Integer code;
	private String message;
	private Object data;

	public void setResultCode(ResultCode resultCode) {
		this.code = resultCode.code();
	}

	public static Result success() {
		Result result = new Result();
		result.setResultCode(ResultCode.SUCCESS);
		return result;
	}

	public static Result success(Object data) {
		Result result = new Result();
		result.setResultCode(ResultCode.SUCCESS);
		result.setData(data);
		return result;
	}

	public static Result failure(Integer code, String message) {
		Result result = new Result();
		result.setCode(code);
		result.setMessage(message);
		return result;
	}
}

// 错误结果实体
@Data
public class ErrorResult {
	private Integer code;
	private String message;
	
	public ErrorResult(Integer code, String message){
		this.code = code;
		this.message = message;
	}
}

控制层Controller

后端会在controller层处理业务请求,并返回给前端。

@RestController
@RequestMapping("/demo")
public class DemoController {
	@GetMapping("/ok")
	public Result ok() {
		return Result.success("ok...");
	}
}

返回体统一处理

@ExceptionHandler

接受请求处理方法抛出的异常。

@RestController
@RequestMapping("/demo")
public class DemoController {

	@GetMapping("/ok")
	public String ok2() {
		int i = 10 / 0;
		return "ok..";
	}

	@ExceptionHandler(RuntimeException.class)
	public String runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
		return e.getMessage();
	}

}

在这里插入图片描述

@ModelAttribute

往请求的Model里加数据。

@RestController
@RequestMapping("/demo")
public class DemoController {

	@GetMapping("/ok")
	public String ok(ModelMap modelMap) {
		return modelMap.get("name").toString();
	}

	@GetMapping("/ok2")
	public String ok2(@ModelAttribute("name") String name) {
		return name;
	}

	@ModelAttribute
	public void model(Model model) {
		model.addAttribute("name", "James");
	}
}

@RestControllerAdvice

将@ExceptionHandler和@ModelAttribute注解应用到所有的控制器上。是@ControllerAdvice和@ResponseBody注解的结合体。
因为@RestControllerAdvice被元注解@Component标记,所以它也是可以被组件扫描扫到并放入Spring容器的。

如果只想对一部分控制器添加通知,比如某个包下的控制器,可以这样写:
在这里插入图片描述
如果只想对某几个控制器添加通知,可以这样写:
在这里插入图片描述

标记注解类

用来标记方法的返回值,是否需要包装。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface ResponseResult {
}

请求拦截器

拦截请求,是否此请求返回的值需要包装,其实就是运行的时候,解析@ResponseResult注解。

import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
/**
 * 响应处理拦截器
 */
@Component
public class ResponseResultInterceptor implements HandlerInterceptor {

	public static final String RESPONSE_RESULT_ANN = "RESPONSE_RESULT_ANN";

	/**
	 * 解析控制器类或方法上是否有@ResponseResult注解,如果有表示返回值需要包装
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		if (handler instanceof HandlerMethod) {
			final HandlerMethod handlerMethod = (HandlerMethod) handler;
			final Class<?> clazz = handlerMethod.getBeanType();
			final Method method = handlerMethod.getMethod();
			if (clazz.isAnnotationPresent(ResponseResult.class)) {
				// 判断是否在类对象上加了注解
				request.setAttribute(RESPONSE_RESULT_ANN, clazz.getAnnotation(ResponseResult.class));
			} else if (method.isAnnotationPresent(ResponseResult.class)) {
				// 判断是否在方法上加了注解
				request.setAttribute(RESPONSE_RESULT_ANN, method.getAnnotation(ResponseResult.class));
			}
		}
		return true;
	}
}

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
	@Autowired
	private ResponseResultInterceptor responseResultInterceptor;

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		InterceptorRegistration registration = registry.addInterceptor(responseResultInterceptor);
		// 拦截所有请求
		registration.addPathPatterns("/**");
		// 添加不拦截路径
		registration.excludePathPatterns("/login", "/error", "/logout", "/login.html");
	}
}

此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。

重写返回体

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice<Object> {

	public static final String RESPONSE_RESULT_ANN = "RESPONSE_RESULT_ANN";

	/**
	 * 捕获 CustomException异常
	 */
	@ExceptionHandler(CustomException.class)
	public ErrorResult runtimeExceptionHandler(HttpServletRequest request, final Exception e,
			HttpServletResponse response) {
		CustomException customException = (CustomException) e;
		return new ErrorResult(customException.getCode(), customException.getMessage());
	}

	/**
	 * 捕获 Exception异常
	 */
	@ExceptionHandler(Exception.class)
	public ErrorResult exceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
		response.setStatus(HttpStatus.BAD_REQUEST.value());
		return new ErrorResult(HttpStatus.BAD_REQUEST.value(), e.getMessage());
	}

	/**
	 * 获取请求中是否有包装注解标记,没有直接返回,如果有则需要重写返回体
	 */
	@Override
	public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) {
		ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = sra.getRequest();
		// 获取请求是否有包装标记
		ResponseResult responseResultAnn = (ResponseResult) request.getAttribute(RESPONSE_RESULT_ANN);
		return responseResultAnn == null ? false : true;
	}

	/**
	 * 重写返回体
	 */
	@Override
	public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
			Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
			ServerHttpResponse response) {
		log.info("进入返回体处理");
		if (body instanceof ErrorResult) {
			ErrorResult errorResult = (ErrorResult) body;
			return Result.failure(errorResult.getCode(), errorResult.getMessage());
		}
		return Result.success(body);
	}

}

上面代码首先做了全局的异常处理,然后判断是否需要返回值包装,如果需要就直接包装。

重写Controller

最后在控制器类上或者方法体上加上@ResponseResult注解,就可以进行返回值统一处理了。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo")
public class DemoController {
	@ResponseResult
	@GetMapping("/ok2")
	public String ok2() {
		try {
			int i = 10 / 0;
		} catch (Exception e) {
			throw new CustomException(ResultCode.SYSTEM_ERROR.code(), ResultCode.SYSTEM_ERROR.message());
		}
		return "ok..";
	}
}

参考:
Java项目构建基础:统一结果,统一异常,统一日志

SpringBoot实现接口:统一返回值、全局异常处理、Swagger接口文档 在 Spring Boot 应用中实现统一返回值和全局异常处理可以带来多方面的好处,这些好处不仅提升了代码的可读性和可维护性,还增强了应用的健壮性和用户体验。通过定义统一的返回值格式,可以确保整个应用中的API响应结构保持一致。统一的异常处理机制使得错误信息的返回方式也保持一致,便于前端开发者理解和处理。 阅读详情

相关推荐

Java接口统一样式返回模板的实现

主要介绍了Java接口统一样式返回模板的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

如何设计 API 接口,实现统一格式返回?

统一在一个文件中定义错误码;错误码长度为 5 位;第 1 位表示错误是哪种级别?例如:1 为系统级错误,2 为业务模块错误,可标记 9 种错误级别。第 2 位和第 3 位表示错误是哪个模块?例如:01 为用户模块,02 为订单模块,可标记 99 个模块。第 4 位和第 5 为表示具体是什么错误?例如:01 为手机号不合法,02 为验证码输入错误,可标记 99 个错误。以上代码供大家参考,还有优化的空间,欢迎大家使用并提出宝贵意见。

APItesterCris的博客 810

从EXIF到测绘:解码大疆影像元数据的实战应用指南

本文深入解析了大疆无人机影像元数据的实战价值,重点阐述了如何利用EXIF和XMP中的GPS、RTK、姿态角及相机内参等关键信息,提升测绘、三维重建及精准农业等项目的成果精度与效率。通过自动化质检脚本与行业应用场景剖析,指导从业者将元数据从信息转化为生产力,实现从拍照到专业测绘的跨越。

dell8的博客 526

SpringBoot之统一返回格式与统一异常处理

文章目录导入Jar包配置统一结果返回配置全局异常处理效果测试 在任何接口返回数据时,正确的返回格式: code:状态码 data:数据 message:接口响应信息,一般接口需要的就是这三个数据。 { "code": 200, "data": "success", "message": "成功" } 但是如果在每一个接口都这样写一个Map返回,或者一个工具类返回,但是这样代码的重复量太复杂。 统一返回的好处:接口返回的东西直接返回,接口的中不用管状态码和响应信息 导入Jar包 &l

不要用过去的错误约束现在的自己。 2668

Flutter 中使用蓝牙插件报错,说没有权限怎么解决

2、在build.grale里面更改一下版本号,我修改的是targetSdkVersion这个版本号,需要根据你自己的版本进行更改,记得更改之后先flutter clean一下再run。搞了一晚上,没搞出来,第二天用同事手机测试发现他手机可以,我手机还是不行,才发现是Android版本问题,需要修改两处地方。废话不多说,咱先看报错信息。

zzj17637822814的博客 2289

Moltemplate建模----水盒子data文件

1功能介绍 Moltemplate是LAMMPS官方支持的建模工具之一,适用于LAMMPS建模。该程序创建了一种简单的文件格式来存储分子定义和力场,即模板LT。LT文件包含与特定分子有关的所有文本(包括坐标,键拓扑,角度,力场参数,约束,组和修复)。 Moltemplate可以复制分子,对其进行自定义,然后用它作为构建更大、更复杂分子的基础。构建后,可以自定义...

元素魔方科研服务 2595

SpringBoot实现RESTful API返回统一数据格式

关于 Spring 的全局处理,有两方面要说: 统一数据返回格式 统一异常处理 通用返回值类定义: public class GlobalResponse<T> implements POJO { /** * */ private static final long serialVersionUID = 1L; @ApiModelPro...

Crystalqy的博客 3万+

基于深度学习YOLOv8的商品识别系统(深度学习 + UI界面 + 训练数据集 + Python代码)

如果使用自定义数据集,可以通过图像标注工具如LabelImg来标注每个商品的类别和边界框,并保存为YOLO格式的文本文件。bash复制编辑/dataset/images/train/val/labels/train/val这样,我们就准备好了数据集,可以开始训练YOLOv8模型。本文介绍了如何使用YOLOv8构建一个商品识别系统,包括从数据准备到模型训练,再到UI界面的开发。通过深度学习技术,尤其是YOLOv8的高效目标检测能力,我们能够快速实现商品识别并集成到实际应用中。

YOLO 302

API统一返回数据格式

如今的项目,基本上都是前后端分离,而且前端的生态也已经很强大。后端基本上只要保证数据响应就可以了。 那么,接口交互就成了前后端对接最重要也是最耗时的工作。而提高交互效率的最好的方法就是统一数据格式,后端把数据丢到一个统一的格式中去,前端解析数据也从固定的格式中去取。这样,前端就省去复杂的无关数据解析,能直接拿到想要的数据。后端也只需要把数据丢到固定的格式中去,不用每次都要包装一下。 格式统一 达到...

meiyouya优快云的博客 2646

Python接入企业微信群机器人图文教程,实现恐贪指标自动触发微信消息提醒功能!Python 企业微信 群机器人 消息提醒 Webhook 企业微信接口

✅ 企业微信群机器人的添加方式;✅ 如何获取 Webhook 地址;✅ Python 如何用 requests 发消息;✅ 如何在实际业务中触发自动提醒;这种方式不仅适合个人开发者、测试人员,也适用于小团队、运维通知等场景,部署简单、触发灵活、响应及时!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 915

近五年体内微/纳米机器人赋能肿瘤精准治疗综述:以 GBM 为重点

摘要 微/纳米机器人在实体瘤治疗领域展现出突破性潜力,通过主动运动能力解决传统纳米药物递送效率低、渗透不足等核心问题。2021-2025年间形成三条技术路线:1) 磁驱、声驱等运动增强递送实现深层渗透;2) 与免疫治疗融合实现原位免疫唤醒;3) 针对胶质母细胞瘤开发跨屏障递送系统。研究重点从单一运动性能转向"运动-分布-疗效"的系统评价,需建立标准化指标评估运动学参数、肿瘤分布均匀性和安全性。未来挑战在于临床转化的可制造性、闭环操控及生物相容性优化,特别是对血脑屏障穿透等复杂场景的系统集

AllenLV的博客 5121

SpringBoot统一接口返回和全局异常

写在最前:后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。如何构建,这是我们应该深入思考的问题,公司不同,规范不同,要求不同。不管公司有没有要求,我们对自己必须要有要求。 今天的这篇文章我们主要介绍,怎么统一处理下接口的返回格式问题。 在写后端接口,思考下药做些什么:请求,逻辑处理,返回。 这似乎已经可以满足对用户管理操作的需求,但是对于一个查询用户方法来讲代码量还是可以接受的,但是对于一个简单的更

拾一二的博客 8277

Python全栈入门到实战【进阶篇 1】类与对象:面向对象编程的基石

Python中定义类使用**class关键字**,创建对象使用**类名()**(类似调用函数),语法简洁,我们从最基础的空类开始,逐步拆解。class# 定义空的学生类,pass表示占位,无实际内容 class Student : pass编码规范:类名遵循大驼峰命名法(每个单词首字母大写,无下划线),如StudentCarPhone,这是Python官方推荐的PEP8规范,便于区分类和其他标识符。实例方法必须定义在类内部;实例方法的第一个参数必须是self(名称可自定义,如this。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3403

Springboot如何设计出优雅的后端(API)接口(一)

项目背景 现在绝大部分项目都是采用前后端分离的模式,对于前端来说,后端如果能有一个规范的、优雅的设计的api模式,那么前端的开发将会事倍功半,同时对于后端来说,统一的格式也有利于后期的维护和扩展(其实主要是甩手的时候,不至于下一个人看不懂=。=)。 一个后端的接口分为四个部分:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。下面我们就从这四个部分分析需要的注意的点。 后续我会把项目上传到github上,感兴趣的同学可以帮忙点个爱心。 需要思考

我是你妹她哥的博客 5043

FAST-LIVO2 源码精读(五):IMU 运动模型、离散传播与去畸变原理

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏第五篇,数学基础篇章(第 4–7 篇)的第二篇。上一篇在 SO(3) 流形上建立了姿态表示与右扰动模型;本篇聚焦 IMU 预积分的核心问题:一帧激光扫描横跨约 100 ms,帧内每一个点的采集时刻各不相同,如何利用 200 Hz 的 IMU 量测将全帧点云统一对齐到帧末时刻?答案完整封装在(587 行)的函数中,本篇逐段拆解其四阶段逻辑,并推导协方差矩阵随误差状态转移矩阵F_x逐帧演化的物理含义。

PX4-SLAM-PNC 157

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

API接口的RESTful设计

前言:在移动互联网、分布式和微服务盛行的今天,现在好多大点的项目都会采用的微服务框架,前后端分离方式。前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟,可以进行移动端跨平台开发,也可以通过node.js写服务端的Controller。 一般系统的大致整体架构图如下: 需要说明的是,这个架构也太简单了吧,什么网关、Redis缓存、MQ消息中间件都没有。因为这篇主要介绍的是API接口,所以我们聚焦点,其他的模块小伙伴们自行去补充。 1、前后端接口交互 前端和后端进

何哥的博客 3789

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用统一返回结果类优化API设计

在开发Web应用的过程中,API接口的设计是重要的一环。这些API接口返回的数据格式必须清晰且一致,方便客户端进行处理。统一返回结果类就是这样一种工具,它规定了所有API接口返回数据的通用格式。code:响应状态码。一般来说,我们会规定1代表操作成功,0代表操作失败。msg:响应的消息,用于简单描述本次请求的结果或错误信息。data:返回的数据。这个字段通常在请求成功,并且需要返回额外数据时使用。

weixin_53027065的博客 555

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Spring boot项目设定返回数据为JSON固定格式

1.配置处理json的配置类 package com.test.config; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.s

HLoach的博客 6365

Springboot 套餐接口

【代码】Springboot 套餐接口。

2401_87471892的博客 31

尚医通(三)医院设置模块后端 | swagger | 统一日志 | 统一返回结果

尚医通(三)医院设置模块后端 | swagger | 统一日志 | 统一返回结果

Knight 1576

面试官:说说你对 RESTful 的理解?

REST涉及一些概念性的东西可能比较多,在实战RESTful API之前,要对REST相关的知识有个系统的认知。RESTful风格的API 固然很好很规范,但大多数互联网公司并没有按照或者完全按照其规则来设计,因为REST是一种风格,而不是一种约束或规则,过于理想的RESTful API 会付出太多的成本。比如RESTful API也有一些缺点。

cxytony的博客 162

Spring Boot 无侵入式 实现API接口统一JSON格式返回

无侵入式 统一返回JSON格式 其实本没有没打算写这篇博客的,但还是要写一下写这篇博客的起因是因为,现在呆着的这家公司居然没有统一的API返回格式????,询问主管他居然告诉我用HTTP状态码就够用了(fxxk),天哪HTTP状态码真的够用吗?在仔细的阅读了项目源码后发现,在API请求的是居然没有业务异常(黑人问好)。好吧 居然入坑了只能遵照项目风格了,懒得吐槽了。 因为项目已经开发了半年多了, 要是全...

小魏的奇妙世界 1万+

SpringBoot之统一数据返回格式

详解SpringBoot的统一数据返回格式,特别是结合源码讲解了返回类型为String时的异常问题。

. 1万+

SpringBoot 使用 beforeBodyWrite 实现统一的接口返回类型

通常我们在 Spring Boot 的项目中,会使用一个类来作为统一的接口返回,比如这样: import lombok.Data; @Data public class Result<T> { private int code; private String message; private T data; public static <T> Result<T> success(T t) { Result<T&gt

qq_37170583的博客 1万+

Spring Boot 系列:RestFul API 接口实现统一格式返回

文章目录背景一、统一格式设计1.1 返回格式1.2 状态码1.3 错误信息1.4 返回对象1.5 成功标示二、实现方案2.1 错误码枚举2.2 统一结果集封装三、测试及总结3.1 简单的测试3.2 其他3.3 技术交流 背景 在分布式、微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式。前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,...

风尘博客 5775

SpringBoot使用validation实现接口参数统一校验、统一返回值、自定义注解

SpringBoot接口参数统一校验、统一返回值、自定义注解看这一篇就够了

weixin_44506280的博客 2495
上一篇: Java开发 之Spring中内置工具类
下一篇: Redis 之Jedis客户端
yyangqqian
博客等级 码龄15年 406粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值