Controller统一异常处理和yaml配置

目录

Controller统一异常处理

url解析

static下静态资源文件的访问

配置类

如何访问static下的资源文件

yaml基础语法

注解赋值

批量注入

单个注入

Controller统一异常处理

Controller统一异常处理@ControllerAdvice:统一为Controller进行"增强"

@ExceptionHandler : 异常处理

Controller 统一异常处理, 对参数绑定异常的异常统一处理。
存在的原因:不想以异常堆栈的形式显示给用户,当多个线程访问这个方法时,就会造成大量的代码冗余,采用统一异常的形式来显示给用户。
ResponseBody,以JSON的格式返回给浏览器。
优化前。优化后,见本文代码片段2
   @RequestMapping("/vali")@ResponseBodypublic String dovali(@Valid Dog dog, BindingResult result){//获取错误结果个数int count = result.getErrorCount();//判断if (count>0){List<FieldError> fieldErrors = result.getFieldErrors();for (int i = 0; i < fieldErrors.size(); i++) {FieldError fieldError =  fieldErrors.get(i);System.out.println(fieldError.getField());System.out.println(fieldError.getRejectedValue());System.out.println(fieldError.getDefaultMessage());}return "失败";}else{System.out.println(dog);return "成功";}}
代码片段1
缺点:可能会造成异常来源不清晰。
代码流程
1.实体类数据校验
2.在url路径里面传来的参数的key是对的,但是参数格式不对,email格式不对。
比如,url路径为 http://localhost:8081/demo01/exercise?name=summer&email=283

url解析

参数配置,位置在application.yml
url1

参数绑定(1)

数据校验部分:参数校验关键字@valid和@notnull和@email的校验

url2 

url3 

包名: import org.springframework.web.bind.annotation.ExceptionHandler;

package com.apesource.springboot_init_01.util;import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class BindExceptionUtilAdvice {@ExceptionHandler(BindException.class)@ResponseBodypublic String handlerexception(BindException bindException){//        System.out.println(bindException.getMessage());return  "全局异常处理器成功";}
}
代码片段2

参数绑定(2)

参数绑定另一形式,在需要数据校验的类上面写注解@Validated
@Validated
public class Person {
@NotNull(message = "用户名不能为空")private String name;private String lastName;@NotNull(message = "年龄不能为空")@Max(value = 130,message = "够了,机会还是要留给年轻人的")private int age;private boolean marry;private Date birth;private Map<String,Object> maps;private List<Object> lists;private Dog dog;

代码片段3

Static下静态资源文件的访问

在enjoy和spring的整合下,就会涉及到static下静态资源文件的访问,加载enjoy模版引擎之后,就会要去加载一个视图文件

配置类

加载视图文件需要配置类。在Usercontroller接受到请求之后,就会找到对应的方法,执行完方法的逻辑之后,这个时候拦截器由于SpringBootconfig,就会返回界面。没有SpringBootconfig,就得不到xx.html。

package com.apesource.springboot_web_01.config;import com.jfinal.template.Engine;
import com.jfinal.template.ext.spring.JFinalViewResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @version 1.0* @Author* @since 2023/4/11*/
@Configuration
public class SpringBootConfig {@Bean(name = "jfinalViewResolver")public JFinalViewResolver getJFinalViewResolver() {// 创建用于整合 spring boot 的 ViewResolver 扩展对象JFinalViewResolver jfr = new JFinalViewResolver();// 对 spring boot 进行配置jfr.setSuffix(".html");jfr.setContentType("text/html;charset=UTF-8");jfr.setOrder(0);// 设置在模板中可通过 #(session.value) 访问 session 中的数据jfr.setSessionInView(true);// 获取 engine 对象,对 enjoy 模板引擎进行配置,配置方式与前面章节完全一样Engine engine  = JFinalViewResolver.engine;// 热加载配置能对后续配置产生影响,需要放在最前面engine.setDevMode(true);// 使用 ClassPathSourceFactory 从 class path 与 jar 包中加载模板文件engine.setToClassPathSourceFactory();// 在使用 ClassPathSourceFactory 时要使用 setBaseTemplatePath// 代替 jfr.setPrefix("/view/")engine.setBaseTemplatePath("/templates/");// 更多配置与前面章节完全一样// engine.addDirective(...)// engine.addSharedMethod(...);return jfr;}
}

代码片段4

如何访问static下的资源文件

1.只要静态资源放在类路径下:/static、/public、/resources、/META-INF/resources可以被直

接访问-对应文件WebProperties.java源码

private static final String[] CLASSPATH_RESOURCE_LOCATIONS={"classpath:/META-INF/resources/","classpath:/resources/","classpath:/static/","classpath:/public/"};
2.常见静态资源:JS、CSS、图片(.jpg .png .gif .bmp .svg)、字体文件(Fonts)等

3.访问方式:默认:项目根路径/+静态资源名 比如 http://localhost:8080/hi.jpg
原文链接:https://blog.csdn.net/weixin_49764008/article/details/128668539s

顺带说一下,因为在WEB_INF下的资源文件有安全访问限制,所以不可以直接通过url访问这些资源文件,只可以通过在controller中的方法返回的网页的前缀名(String)访问这些资源文件。

位置:application.yml

spring.mvc.static-path-pattern=/prefix/**                                        语句1

未加语句1之前 http://localhost:8080/1.jpg,加之后     http://localhost:8080/prefix/1.jg

Yaml基础语法

数组
commpany: [xxx,xxxx,xxxx]
address:
        - beijing
        - shanghai
对象/map
person:
        name: wangzhuo
# 行内写法
person: {name: wangzhuo}
对象数组
users2 : [ { name : Tom , age : 4 },{ name : Jerry , age : 5 } ]
YAML :参数引用   
name : wangzhuo
person :
        pet : $ { name

注解赋值

批量注入

@ConfigurationProperties( prefix = "person1"
匹配 @PropertySource ( value = "classpath:dog.yml" )中前缀名为person1的格式和内容。
支持复杂类型

单个注入

@Value
不支持复杂类型
@Value("${lists}")
List<String> lists;
如果复杂类型有了value注解,就会导致参数绑定异常

在xml中的应用表单

<form action="/one/show4" method="post">员工编号:<input type="text" name="eid" ><br/>员工姓名:<input type="text" name="ename" ><br/>员工性别:<input type="text" name="esex" ><br/>部门编号:<input type="text" name="dept.did" ><br/>部门名称:<input type="text" name="dept.dname" ><br/><input type="submit" value="发送请求4"/>
</form>
员工编号1:<input type="text" name="mylist[0].eid" ><br/>
员工姓名1:<input type="text" name="mylist[0].ename" ><br/>
员工性别1:<input type="text" name="mylist[0].esex" ><br/>
员工编号2:<input type="text" name="mylist[1].eid" ><br/>
员工姓名2:<input type="text" name="mylist[1].ename" ><br/>
员工性别2:<input type="text" name="mylist[1].esex" ><br/>
给List<emp>当中传入两个对象员工编号3:<input type="text" name="myMap['one'].eid" ><br/>
员工姓名3:<input type="text" name="myMap['one'].ename" ><br/>
员工性别3:<input type="text" name="myMap['one'].esex" ><br/>
员工编号4:<input type="text" name="myMap['two'].eid" ><br/>
员工姓名4:<input type="text" name="myMap['two'].ename" ><br/>
员工性别4:<input type="text" name="myMap['two'].esex" ><br/>
map的key为中括号当中的内容,value为用户输入的内容
<form action="/one/map" method="post">员工编号:<input type="text" name="xxx"><br/>员工姓名:<input type="text" name="yyy"><br/>员工性别:<input type="text" name="zzz"><br/><input type="submit" value="发送请求4(map)"/>
</form>

以map接收,key为name,value为用户输入的内容

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

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

相关文章

golang在goland编译时获取环境变量失效

在golang中&#xff0c; 我们通常使用os包来获取环境变量&#xff0c;如&#xff1a; os.Getenv() os.LookupEnv() 等。 但如果我们使用goland编译器&#xff0c;在编译是&#xff0c;这时操作环境变量&#xff0c;会发现os包读取到的环境变量值不变&#xff1a; 新增后&am…

ubuntu20.4 更新中科大软件源

打开软件源配置文件以编辑&#xff1a; sudo nano /etc/apt/sources.list在编辑器中&#xff0c;你会看到当前的软件源列表。将这些源更改为一个可用的源&#xff0c;例如使用中国科大源&#xff1a; deb http://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe …

(Clock Domain Crossing)跨时钟域信号的处理 (自我总结)

CummingsSNUG2008Boston_CDC.pdf 参考&#xff1a; 跨时钟域处理方法总结–最终详尽版 - love小酒窝 - 博客园 跨时钟域&#xff08;CDC&#xff09;设计方法之单bit信号篇&#xff08;一&#xff09; | 电子创新网赛灵思社区 孤独的单刀_Verilog语法,FPGA设计与调试,FPGA接口与…

LVGL移植win端模拟显示流畅解决方案-使用 SquareLine 生成前端 UI 文件

lvgl_port_win_vscode 在 win 平台对 lvgl 方便的进行模拟显示&#xff0c;程序文件结构清晰&#xff0c;lvgl with SDL2&#xff0c;cmake 构建&#xff0c;VsCode 一键运行&#xff0c;使用 SquareLine 生成前端 UI 文件&#xff0c;win 上直接跑。 相比官方的 lvgl 移植到…

不同层设置不同学习率

使用预训练模型时&#xff0c;可能需要将 &#xff08;1&#xff09;预训练好的 backbone 的 参数学习率设置为较小值&#xff0c; &#xff08;2&#xff09;而backbone 之外的部分&#xff0c;需要使用较大的学习率。 from collections import OrderedDict import torch.nn …

Redis 集合(Set)快速指南 | Navicat

Redis 支持通过多种数据类型来存储项目集合。其中&#xff0c;包括列表、集合和哈希。上周的博文介绍了列表&#xff08;List&#xff09;数据类型并重点介绍了一些用于管理列表&#xff08;List&#xff09;的主要命令。在今天的文章中&#xff0c;我们将转向关注集合&#xf…

P-MVSNet ICCV-2019 学习笔记总结 译文 深度学习三维重建

文章目录 5 P-MVSNet ICCV-20195.0 主要特点5.1 文章概述5.2 研究方法5.2.1 特征提取5.2.2 学习局域匹配置信5.2.3 深度图预测5.2.4 Loss方程MVSNet系列最新顶刊 对比总结5 P-MVSNet ICCV-2019 深度学习三维重建 P-MVSNet-ICCV-2019(原文、译文、批注) 下载 5.0 主要特点 …

【MySQL基础】--- 约束

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、什么…

Ceph入门到精通-ceph pool 删除导致 misplaced 的原因

misplaced 的原因 Ceph中的misplaced对象是指将对象&#xff08;或对象的副本&#xff09;存储在错误的位置上&#xff0c;这可能会导致性能下降或数据不一致的问题。在删除Ceph池时&#xff0c;可能会导致misplaced的原因有以下几个&#xff1a; 删除过程中的操作失误&#x…

Python 打印文本进度条

""" 打印文本进度条知识点&#xff1a;1、字符串运算&#xff0c;注意只能适用于加法、乘法&#xff0c;例如&#xff1a;123 123 123123例如&#xff1a;123 * 3 1231231232、循环语句while、for3、条件语句if4、重点&#xff1a;转义字符\r&#xff0c;可以…

【springMvc】自定义注解的使用方式

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 1.前言 1.1.什么是注解 Annontation是Java5开始引入的新特征&#xff0c;中文名称叫注解。 它提供了一种安全…

python的多线程多进程与多协程

python的多线程是假多线程&#xff0c;本质是交叉串行&#xff0c;并不是严格意义上的并行&#xff0c;或者可以这样说&#xff0c;不管怎么来python的多线程在同一时间有且只有一个线程在执行(举个例子&#xff0c;n个人抢一个座位&#xff0c;但是座位就这一个&#xff0c;不…

Unity中UI组件对Shader调色

文章目录 前言一、原理在Shader中直接暴露的Color属性&#xff0c;不会与UI的Image组件中的Color形成属性绑定。因为UI的Image组件中更改的颜色是顶点颜色&#xff0c;如果需要在修改组件中的颜色时&#xff0c;使Shader中的颜色也同时改变。那么就需要在应用程序阶段传入到顶点…

gin 基本使用

gin 初体验 import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})r.Run() }gin 路由接受一个 type …

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找 所谓的查找或搜索&#xff0c;指从一组数据对象中找出符合特定条件者&#xff0c;这是构建算法的一种基本而重要的操作。其中的数据对象&#xff0c;统一地表示和实现为 词条&#xff08;entry&#xff09; 的形式&#xff1b;不同词条之间&#xff0c;依照各自的 关键码…

Golang slice 通过growslice调用nextslicecap计算扩容

先来看一段代码 code: e : []int64{1, 2, 3}fmt.Println("cap of e before:", cap(e))e append(e, 4, 5, 6, 7)fmt.Println("cap of e after:", cap(e))output:cap of e before: 3 cap of e after: 8 为什么容量是8&#xff1f; append了的4个元素&…

Python:使用PySimpleGUI中sg.Input控件获取数据plot导致yticks错乱

sg.Input获取y轴数据代码 sg.Text(First Read:, font("Times New Roman", 9)),sg.Input(key-first_read-, size(25, 1), default_text0,0,0, justificationcenter, font("Times New Roman", 9), expand_xTrue), sg.Text(Second Read:, font("Times Ne…

Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用

文章目录 1、官网简介2、在vue3中使用1)、需要导入vue3支持的版本插件2)、在mian.js里引入&#xff1a;3)、在组件中使用 3、layout布局的计算逻辑4、 gridLayout 的属性 该栅格系统目前对 vue2 的支持是最好的&#xff0c;vue3 是需要用插件支持的&#xff0c;会在小节详细讲解…

求二维子数组的和(剖析)

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;本篇剖析一下二维子数组求和规则&#xff1a; &#x1f412;个人主页 &#x1f3c5;JavaSE系列专栏 &#x1f4d6;前言&#xff1a;本篇剖析一下二维子数组求和 规则&#xff1a; 这…

Qt中音频的使用

对于音频我们在使用的过程中一般是录制音频、播放音频。针对这两个需求介绍Qt中音频的使用。 Qt中音频的录制 步骤&#xff1a; 1、获取系统中的音频设备。 2、创建QAudioRecorder对象&#xff0c;指定使用的音频设备&#xff0c;通过QAudioRecorder的setAudioInput函数设置…