form-binder 0.8.0 发布,微型数据绑定和校验框架

Tu_Minglei
 Tu_Minglei
发布于 2014年11月03日
收藏 8

这次改动比较大,所以跳过了 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): _*)

另外,阅读源码的同学应该能发现,重构后的代码比原来更清晰、更容易扩展了。

更多的细节,请查阅项目文档和源码。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:form-binder 0.8.0 发布,微型数据绑定和校验框架
加载中
返回顶部
顶部