edyang

我干了什么 究竟拿了时间换了什么
技术分享时间线软件开发、设备接入、视觉与运维实践

Spring MVC:统一异常响应要保留错误含义

所有异常都返回“操作失败”,用户无法行动,开发也难定位。

所有异常都返回“操作失败”,用户无法行动,开发也难定位。统一处理应统一结构,而不是抹平原因。 本文使用JDK 7、Spring Framework 3.2.6 与 Servlet 容器,代码为结构片段。把请求入口、业务服务和数据访问拆开,是为了明确依赖与事务归属。容器能够装配对象,但应用仍须负责业务规则、异常含义和外部资源生命周期。 1. 从现象推到机制 参数错误、未授权、资源不存在和...

Spring MVC:参数绑定成功不代表输入合法

请求参数能转成对象,只说明完成了类型绑定。

请求参数能转成对象,只说明完成了类型绑定。业务有效性和权限还需要单独检查。 本文使用JDK 7、Spring Framework 3.2.6 与 Servlet 容器,代码为结构片段。把请求入口、业务服务和数据访问拆开,是为了明确依赖与事务归属。容器能够装配对象,但应用仍须负责业务规则、异常含义和外部资源生命周期。 1. 从现象推到机制 绑定负责把字符串转换为字段类型,格式错误应反馈为...

Spring 学习:Bean 生命周期与资源释放

连接、线程和文件句柄如果由组件创建,就需要有对应的释放时机。

连接、线程和文件句柄如果由组件创建,就需要有对应的释放时机。Bean 生命周期提供的是挂接点。 本文使用JDK 7、Spring Framework 3.2.6 与 Servlet 容器,代码为结构片段。把请求入口、业务服务和数据访问拆开,是为了明确依赖与事务归属。容器能够装配对象,但应用仍须负责业务规则、异常含义和外部资源生命周期。 1. 从现象推到机制 容器完成对象创建与依赖设置后...

Spring AOP 学习:同类内部调用为何绕过事务

方法上有事务注解,运行时却没有预期事务行为,常见原因是调用没有经过代理边界。

方法上有事务注解,运行时却没有预期事务行为,常见原因是调用没有经过代理边界。 本文使用JDK 7、Spring Framework 3.2.6 与 Servlet 容器,代码为结构片段。把请求入口、业务服务和数据访问拆开,是为了明确依赖与事务归属。容器能够装配对象,但应用仍须负责业务规则、异常含义和外部资源生命周期。 1. 从现象推到机制 基于代理的 AOP(面向切面编程)在外部调用进...

Spring 学习:用构造依赖说明 IoC 的价值

对象自己创建数据库访问对象时,业务规则和基础设施容易绑在一起。

对象自己创建数据库访问对象时,业务规则和基础设施容易绑在一起。依赖注入让这条关系变得显式。 本文使用JDK 7、Spring Framework 3.2.6 与 Servlet 容器,代码为结构片段。把请求入口、业务服务和数据访问拆开,是为了明确依赖与事务归属。容器能够装配对象,但应用仍须负责业务规则、异常含义和外部资源生命周期。 1. 从现象推到机制 IoC(控制反转)把对象装配交给...

Maven 依赖冲突:为什么编译和运行用到不同的类

项目能编译,运行却报找不到方法,可能是实际加载的 jar 与编译期版本不同。

项目能编译,运行却报找不到方法,可能是实际加载的 jar 与编译期版本不同。 本文使用Java Web 小项目的演示工程与协作场景。初入团队时,重要的不只是写出功能,还包括让别人能够复现、审查和接手。本文使用匿名任务说明工作方法,不指代某家公司的内部流程或真实交付成绩。 1. 从现象推到机制 传递依赖让一个库间接带入另一个库,冲突调解决定最终选用的版本。应用服务器自带库与 WAR 中的...

Eclipse 调试:从一个断点还原请求状态

断点停住以后看所有变量,很容易被框架对象淹没。

断点停住以后看所有变量,很容易被框架对象淹没。调试应围绕一个具体假设收集证据。 本文使用Java Web 小项目的演示工程与协作场景。初入团队时,重要的不只是写出功能,还包括让别人能够复现、审查和接手。本文使用匿名任务说明工作方法,不指代某家公司的内部流程或真实交付成绩。 1. 从现象推到机制 先确定错误输入在哪一层首次出现,再从控制器参数、服务条件和 SQL 参数逐段比较。单步进入不...

Eclipse 配置:工程 JDK、编译级别和运行时分开检查

Eclipse 能启动,不代表工程使用了正确的 JDK。

Eclipse 能启动,不代表工程使用了正确的 JDK。编译通过而服务器报类版本错误,往往是环境不一致。 本文使用Java Web 小项目的演示工程与协作场景。初入团队时,重要的不只是写出功能,还包括让别人能够复现、审查和接手。本文使用匿名任务说明工作方法,不指代某家公司的内部流程或真实交付成绩。 1. 从现象推到机制 IDE 自身运行的虚拟机、工程构建路径、编译目标级别和应用服务器运...

SVN 分支与标签:复制便宜,合并仍要有依据

分支并不会自动隔离所有风险。

分支并不会自动隔离所有风险。需要先说清开发线、发布标签和修复如何回流。 本文使用Subversion 1.7 客户端与独立测试仓库。SVN(集中式版本管理)的工作副本保存本地修改和基准版本,仓库保存已提交历史。工作副本中的文件状态与仓库修订号需要分别理解。 1. 从现象推到机制 SVN 的分支与标签通常依靠仓库目录复制约定实现,标签不可变更多依赖团队规则和权限。合并记录帮助追踪已合并修...

SVN 冲突处理:先理解双方修改,再标记解决

更新后出现冲突文件,删除冲突标记只是文本清理。

更新后出现冲突文件,删除冲突标记只是文本清理。真正的工作是确认双方意图如何合并。 本文使用Subversion 1.7 客户端与独立测试仓库。SVN(集中式版本管理)的工作副本保存本地修改和基准版本,仓库保存已提交历史。工作副本中的文件状态与仓库修订号需要分别理解。 1. 从现象推到机制 SVN 尝试把仓库新修订与本地修改合并,重叠编辑可能产生文本冲突。语义冲突则可能完全没有标记,例如...