spring返回400的时候通常没有任何错误提示,当然也通常是参数不匹配。这在参数少的情况下还可以一眼看穿,但当参数很大是,排除参数也很麻烦,更何况,既然错误了,为什么指出来原因呢。...内嵌异常处理 如果只是这个controller的异常做单独处理,那么就适合绑定这个controller本身的异常。 具体做法是使用注解@ExceptionHandler....另外,@ResponseStatus(HttpStatus.BAD_REQUEST)这个注解是为了标识这个方法返回值的HttpStatus code。我设置为400,当然也可以自定义成其他的。 2....Hibernate-validate 使用参数校验如果不catch异常就会返回400. 所以这个也要规范一下。...被注释的元素必须是一个数字,其值必须大于等于指定的最小值 * @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 * @Size
方法也注释掉,此时LocationController类里面已经没有被@ExceptionHandler注解标记的方法了 访问上面的链接,返回结果为 MyExceptionHandler -> 发生RuntimeException...,我们可以得出如下结论 @RestControllerAdvice或者@ControllerAdvice类内的解析器的优先级低于@RequestMapping类的解析器的优先级 如果一个异常能被多个解析器所处理...和@ControllerAdvice有什么区别呢?...名字上就可以猜出@RestControllerAdvice只是在@ControllerAdvice的基础上加了@ResponseBody注解,看一波源码也确实如此。...如果你不明白为什么加了@ResponseBody注解最终返回的内容为JSON,建议看一下返回值处理器相关的内容 源码分析 异常解析器接口定义如下 public interface HandlerExceptionResolver
,里边的高赞回答可知,sql-92标准中指明如果没有排序,那么返回数据的顺序将由数据库实现决定。 2.1 Oracle 的 order by 是稳定排序么?...这意味着: 如果没有执行更新,则即使没有指定ORDER BY子句,或者ORDER BY句中指定的顺序有联系,同一语句也会在重复查询时以相同的顺序返回结果。...然后,更新插入带有4的记录(在指定页之前),删除带有6的记录(在指定页上),并插入带有9的记录(在指定页之后)。更新后,同一查询的结果将为{4、5、7、8}。...官方文档的描述比较符合我的预期,因为我觉得要是我去实现,我就会使用稳定排序的算法去实现,而不是非稳定算法。...我觉得看法太浅了,相当于提出了解决方案,但是不知道为什么能够解决没有了解,另外就是文章感觉个人主观猜想太强了,理论没有依据来源的感觉,可信度就感觉比较低。
另外,有个小伙伴看完上篇文章,觉得这个注解的跟 Spring Interceptor 功能很类似,再加上之前还学习了 Servlet 体系 Filter 功能,不知道这几个有什么区别,感觉很混乱。...如果您对我的专题内容感兴趣,也可以关注我的博客:studyidea.cn 从源码解析背后的原理 上篇文章中我们看到 ResponseBodyAdvice的子类使用 @ControllerAdvice...注解,大家有没有好奇,如果我将@ControllerAdvice换成 @Controller 注解,还能达到上篇文章的效果吗?...这就解释了为什么实现 ResponseBodyAdvice接口的子类一定要与@ControllerAdvice一起使用的原因了。 接下来我们来看下 ResponseBodyAdvice 的执行流程。...这里教给大家一个代码调试的小技巧,当我们不知道一个类在源码中如何被调用的时候,我们可以使用 IDEA 代码调试功能,然后查看代码调用栈。 ?
此注解将作为处理此控制器中抛出的异常的入口点。总而言之,最常见的方法是在@ControllerAdvice类的方法上使用@ExceptionHandler,以便将异常处理应用于全局或控制器的子集。...受影响的控制器子集可以在@ControllerAdvice上使用以下选择器进行定义:annotations(),basePackageClasses()和basePackages()。...如果没有提供选择器,则ControllerAdvice将应用于全局所有的控制器。...Spring程序处理数据库调用的一个常见场景是使用库类通过id去查找记录。但是,如果研究一下CrudRepository.findOne()方法,我们会发现,如果找不到对象,它将返回null。...这意味着如果我们的服务只是调用这个方法并直接返回给控制器,那么即使找不到资源,我们也会得到HTTP返回码200(OK)。
,我们也可以使用组合。...参数绑定也适用于嵌套对象。 下面你可以找到一个例子,将之前引入的排序条件移动到了产品查询条件 POJO 中。 要校验所有嵌套属性,你应该在嵌套对象字段上添加 @Valid 注解。...如果所有嵌套属性都是可选的,那么这可能是预期的解决方案。如果不是,则需在嵌套对象字段上放置 @NotNull 注解。...在我们的例子中,它们应该如下所示: sort.order=ASC&sort.attribute=name 不可变的 DTO 如今,你可以观察到一种趋势,即从传统的带有 setter 的 POJO 转向不可变对象...你可以 在 GitHub 仓库中找到本文中描述的完整代码[6]。我希望呈现的案例是自解释的,但如果有任何疑问,或者你想发表你的看法,我强烈建议你在文章下方留下你的评论。
而Spring MVC是如何做到的资料却比较少,下面会先给出使用的例子和踩过的一个坑。然后进行相应的源码分析,之后再介始ControllerAdvice另外的两种使用方式。...ControllerAdvice的简单使用 ControllerAdvice配合ExceptionHandler可以统一处理系统的异常,我们先定义一个ExceptionAdvice类用于处理系统的两种类型的异常... 下面来看看Spring MVC是如何处理异常的,为什么我手动配置了RequestMappingHandlerMapping和RequestMappingHandlerAdapter ControllerAdvice...也就是为什么ControllerAdvice不会对异常进行处理了,我们同时也可以想到一定是帮助我们注入了一个HandlerExceptionResolver...ControllerAdvice配合使用来处理各种异常的呢?
BY create_date LIMIT 8,2;上面的结果是不是很奇怪,按照大家正常的思考,MySQL 对我们查询的数据进行整体排序,我们按页取出,理论上不应该在不同的页中有相同的数据,下面我们一起来看看隐藏在背后的原因....如果多个行在ORDER BY列中具有相同的值,则服务器可以自由地以任何顺序返回这些行,并且可以根据总体执行计划以不同的方式返回。...如果使用索引排序,那么速度会非常快;如果使用文件排序,所有满足条件都会被选中(不包括 Limit 条件),这些行的大多数,或全部都会被排序直到满足 Limit 的行数。...在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。...我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。
中的form-data也是无效的)上生效, 如果@DateTimeFormat放到@RequestBody下是无效的。...在@RequestBody中则可以使用@JsonFormat把传给后台的时间字符串转成Date,也就是说@JsonFormat其实既可以把传给后台的时间字符串转成Date也可以把后台传出的Date转成时间字符串...用法,@Transient 就是在给某个javabean上需要添加个属性,但是这个属性你又不希望给存到数据库中去,仅仅是做个临时变量,用一下。不修改已经存在数据库的数据的数据结构。...@Transient这个注解一般是用来放在某些数据库中不存在的字段但是你又希望用到的数据上,比如: 这个spu是不存在在我的数据库表中的,但是我又需要使用.就是在这种情况下才会用到@Transient...// 表示使用配置文件中前缀为user1的属性的值初始化该bean定义产生的的bean实例的同名属性 // 在使用时这个定义产生的bean时,其属性name会是Tom @ConfigurationProperties
就连官方的注释上也写着,StringBuffer是一个线程安全的可变的字符序列。StringBuffer可以安全的在多线程场景下使用。 事实真的是这样的吗?还真不是。...为什么使用StringBuffer仍不是万事大吉 首先咱们得定义什么是线程安全,线程安全就是在多线程运行的环境下,最终输出结果是正确的。...append为例 从参加工作到现在,我遇到的所有append,拼接sql是多较多的,或者是把数据库中的几个字段拼接成一段话。...如果是多线程环境运行,你根本无法预测最终结果是什么,不光是你预测不了,JVM自己都不知道最终出来的是个什么货,只能交给天意了 如果有两个线程同时执行append方法 线程1 stringBuffer.append...说了这么多,你发现了没,你找不到一个用StringBuffer的理由,我工作这么久是没见过,不光我没见过,Effective java的作者josh bloch也说没见过,他在书中说: StringBuffer
不知道你在查询数据时有没有用过like语句,比如:查询名字中带有“苏”字的用户,就可能会用类似这样的语句查询: select * from user where name like '%苏%'...为什么会出现这个问题呢? %在mysql中是关键字,如果使用like '%%%',该like条件会失效。 如何解决呢? 需要对%进行转义:/%。...在java中如果使用mybatis作为持久化框架,在mapper.xml文件中,如果入参使用#传值,会使用预编译机制。...删库跑路 也不乏有些攻击者不按常理出牌,sql注入后直接把系统的表或者数据库都删了。...这时,我们需要对数据库线程做监控,如果某条sql执行时间太长,要邮件预警。此外,合理设置数据库连接的超时时间,也能稍微缓解一下这类问题。
撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> ?...说在前面 数据库分页是后台经常要使用的技术手段,有时候进行数据库查询会根据业务需要对某一字段排序,那么当待排序字段值相同时,我们得到的查询结果会是什么呢?...问题原因 期初还很好奇,总数没问题,总查询也没问题,为什么数据会重复了,然后会把部分数据给覆盖了。...如果指定ORDER BY语句,SQL Server将对行进行排序,并按请求的顺序返回。...但是,如果该顺序不是确定性的,即可能有重复的值,则在每个具有相同值的组中,由于与上述相同的原因,该顺序是“随机的”。
所以需要手动创建一个数据库 1、导入数据库 看一眼spring的配置库名叫youyoudb 创建跟这个一样的名称,然后导入表即可 这里的codepay_order是我自己创建的,后边会说到为什么...现在不报错了,这里为什么会不报错主要是因为在数据库中有id为1的用户,可以看一眼数据库 这里的值是我自己加的,所以就不会报错了 这里已经任意用户登录了吧 然后在common.js中可以看到,...其实之前可能有登录功能 但是下载下来的源码并没有,开始以为是作者删了,我又去看了一遍commit,发现根本就没有上传登录的前端源码 看一眼后台的样子 目前所有的搭建都已经完成了 代码审计...也可以注入 严格来说这里算是一处SQL注入,因为在业务上只需要修canDog这一个接口就可以了 3、后台存储XSS 没什么好说的 直接取这里的返回数据展示在前端了,并且在list接口也没过滤...,随后如果exchange如果不为空的话,就从map中get出来pname的值,并赋值给pname,Java是强类型的语言这里定义接收pname的值使用的是String Name,我们POST的参数是int
按照常理说我在泛型方法的形参里面定义一个泛型的委托,他们的形参类型都是一样的占位符,但是如果我使用带有形参的方法作为委托的参数的话是无法进行类型推断的,然后使用无参数的方法作为委托参数是完全没有问题的。...然后必须使用Lambda表达式才能做正确的类型推断,如果直接将带有参数的某个方法作为委托的参数进行传递是无法进行真确的类型推断,这里我表示很不理解。贴出代码与大家讨论一下这个问题。...奇怪的是如果我使用带有参数和返回类型的Lambda表达式作为GetModelList(Func GetFunc)方法的参数时就能正确的类型推断...如果没有实例对象的引用我想扩展方法也毫无意识。所以这里我们使用Count方法来汇总一共有多少Order对象。...而如果我们使用字符串的方式来表达逻辑的结构,那么我们只能在运行时才能知道它的正确性,这样的正确性是很脆弱的,不知道在什么样的情况下会出现问题。
还是被拦截了,那我们再想办法把1=1给替换掉,只要能表示真假值就达到我们的目的了,我首先想到的就是字符(字符表示真),但是也会被拦截。...判断字段数 接下来就是常用的order by语句的绕过了,我看freebuf有个哥们写了一篇文章,直接使用大小写就绕过了,而且他也是安全狗v4.0(他今年(2018)五月份测试的),我测试的时候大小写直接被毫不留情的拦截了...by*/1--+ 不拦截 注:据说有些版本的order by是直接不过滤的,这里也是通过很简单的内联注释就过了,看了安全狗并不在意order by,大多数的waf都是把注意力放在了能爆出数据的union...不知道为什么速度及其慢,跑了一晚上啥也没跑出来,只有再去网上查查资料,看看以往的方法是否可行(这种东西一般是见光死,放出来基本上就没用了) 尽管如此还是被我发现了一些: http://127.0.0.1...当然,我们在注入的时候需要用到union select from,这里如果直接加上from,肯定是会被过滤掉的(毕竟安全狗也不傻),所以,我们只要在from与表名之间按照union 与select之间同样的规则变形就可以绕过了
不知道你在查询数据时有没有用过like语句,比如:查询名字中带有“苏”字的用户,就可能会用类似这样的语句查询: select * from user where name like '%苏%'; 正常情况下是没有问题的...为什么会出现这个问题呢? %在mysql中是关键字,如果使用like '%%%',该like条件会失效。 如何解决呢? 需要对%进行转义:\%。...在java中如果使用mybatis作为持久化框架,在mapper.xml文件中,如果入参使用#传值,会使用预编译机制。...删库跑路 也不乏有些攻击者不按常理出牌,sql注入后直接把系统的表或者数据库都删了。...这时,我们需要对数据库线程做监控,如果某条sql执行时间太长,要邮件预警。此外,合理设置数据库连接的超时时间,也能稍微缓解一下这类问题。
我也不知道这是在干什么,反正我拿到了代码样例,那我们就白嫖一下嘛: @Data class BaseEvent implements ResolvableTypeProvider { private...这是为什么呢? 为什么? 我也不知道为什么,但是我知道源码之下无秘密。 所以,先打上断点再说。...也许在看的过程中,你会冒出这样一个问题:为什么要搞这么麻烦?把这些事件监听的业务逻辑直接写在对应的数据库操作语句之后不行么? 要回答这个问题,我们可以先总结一下事件通知机制的使用场景。...数据变化之后同步清除缓存,这是一种简单可靠的缓存更新方式。只有在清除失败,或者数据库主从同步间隙被脏读才有可能出现缓存脏数据,概率比较小,一般业务上也是可以接受的。...假设这个方案由于某些原因不能使用或者不敢使用是一回事。 但是知不知道这个方案,是另一回事。 好啦,本文的技术部分就到这里了。
前言 小伙伴们应该听说过过滤器、拦截器、切面,印象上都能够起到截断拦截的作用,在做一些业务需求时,不知道如何选择,今天老顾就来介绍一下他们之间的区别。...还有一点需要注意的是,filter中是没法使用注入的bean的,也就是无法使用@Autowired image.png 上面代码注入的值为null。这是为什么呢?...注意点如果controller内部有异常,但异常被@ControllerAdvice 异常统一捕获的话,ex也会为null Aspect切面 AOP操作可以对操作进行横向的拦截,最大的优势在于他可以获取执行方法的参数...总结 我们这里来总结一下过滤器、拦截器、Aspect,看看区别 image.png 如果三者方式同时采用,那他们的执行顺序是什么呢?...你的赞和关注是我继续创作的动力~
2、注释,有单行注释和多行注释,如下图片多行注释很多人不知道,这种写法不仅可以用来添加真正的注释,也可以用来注释代码,非常方便3、缩进就像写 Java,Python 等编程语言一样 ,SQL 也应该有缩进...代替 IN如果 IN 的参数是(1,2,3)这样的值列表时,没啥问题,但如果参数是子查询时,就需要注意了。...4、在 GROUP BY 子句和 ORDER BY 子句中使用索引GROUP BY 子句和 ORDER BY 子句一般都会进行排序,以对行进行排列和替换,不过如果指定带有索引的列作为这两者的参数列,由于用到了索引...id 作为主键比如现在有一个用户表,有人说身份证是唯一的,也可以用作主键,理论上确实可以,不过用身份证作主键的话,一是占用空间相对于自增主键大了很多,二是很容易引起频繁的页分裂,造成性能问题(什么是页分裂...答案是肯定的,SQL优化不是重要,而是相当重要,太重要了…不知道各位小伙伴有没有了解过如何优化MySQL数据库,如果想优化数据库无非是通过四种方式:提升硬件;调整系统配置;重构数据库表结构;SQL优化及使用索引
今天给大家分享一些优秀的后端开发程序员应该具备的开发习惯,希望对大家有帮助~ 1.注释尽可能全面,写有意义的注释 接口方法、类、复杂的业务逻辑,都应该添加有意义的注释 对于接口方法的注释,应该包含详细的入参和结果说明...如果是业务逻辑很复杂的代码,真的非常有必要写清楚注释。 清楚的注释,更有利于后面的维护。...(但是呢,如果是操作数据库,也不要一次性查太多数据哈,可以分批500一次酱紫)。...优秀的后端,要做配置化处理,你可以把这些可变参数,放到数据库一个配置表里面,也可以放到项目的配置文件或者apollo上。...当然,我们linux服务器也一样,平时操作文件,或者数据库连接,IO资源流如果没关闭,那么这个IO资源就会被它占着,这样别人就没有办法用了,这就造成资源浪费。
领取专属 10元无门槛券
手把手带您无忧上云