这次改动比较大,所以跳过了 0.7.0,直接到了 0.8.0. 调整的方向是简化接口、统一体验。展开点说,就是: 合并`BulkPreProcessor`/`PreProcessor`。不像原来的 BulkPreProcessor 只能用于 FormBinder,PreProcessor 只能用于 field mapping,现在的 PreProcessor (接口) 可以通用于 FormBinder 和 field/group mapping 修改扩充`Constraint`。原来的 Constraint 只能用于 field mapping,现在的 Constraint (接口)可以通用于 FormBinder 和 field/group mapping 不过也没有丢弃`Bulk`和`single`的区分,毕竟有些 constraint/pre-processor 只接受 one input string,有些只接受 multiple input strings,所以增加了标记性 trait `InputMode`帮助扩展开发者用来指定和限制 当然还有很多其他的调整和改动,具体请看 Release Notes。在这我就不重写一遍了。 总的来说,这次的调整给普通用户/开发者和扩展开发者,都带来了极大简化和便利,虽然这种简化和便利需要自己作出一些调整来适应。 还好,尽管内部改造进行得轰轰烈烈,对外的影响还是不那么大的。 以下是一些受影响的地方以及相关修改建议: 对普通用户/开发者, 1)`pipe_:` 重命名为`>-:` 建议:应用代码中简单重命名即可 2)constraint `expandJsonData` 重命名为`expandJsonString`,并对参数有调整 建议:原来的应用代码可能是 expandJsonData("body", Some(""))pipe_: FormBinder(messages) 现在应改为 expandJsonString(Some("body"), Some(""))>-: FormBinder(messages) 对扩展开发者, 1)原来的仅应用于 field mapping 的 constraint 是这样写的, def maxlength(length: Int, message: String = ""): Constraint = (label, value, messages) => if (value != null && value.length > length) { Some( (if (message.isEmpty) messages("error.maxlength") else Some(message)).get.format(value, length)) } else None 现在应该这样来写了, def maxlength(length: Int, message: String = "") = mkSimpleConstraint((label, value, messages) => if (value != null && value.length > length) { Some( (if (message.isEmpty) messages("error.maxlength") else Some(message)).get.format(value, length)) } else None) 2)原来的仅应用于 field mapping 的 pre-processor 是这样写的, def geometry(constraints: Constraint*): FieldMapping[Geometry] = new FieldMapping[Geometry](parsing(fromWKT[Geometry], "error.geometry") +: constraints, convert = (value: String) => value match { case null|"" => null case x => fromWKT[Geometry](x) }) 现在让我们这样来做, def geometry(constraints: (Constraint with OneInput)*): Mapping[Geometry, OneInput] = new FieldMapping[Geometry, OneInput]( convert0 = mkSimpleConverter { case null|"" => null case x => fromWKT[Geometry](x) }).>+(parsing(fromWKT[Geometry], "error.geometry") +: constraints): _*) 另外,阅读源码的同学应该能发现,重构后的代码比原来更清晰、更容易扩展了。 更多的细节,请查阅项目文档和源码。 form-binder 0.8.0 发布,微型数据绑定和校验框架下载地址