【发布时间】:2014-06-18 11:40:31
【问题描述】:
scala 是否支持 JSR-303 验证?
如果是的话 - 你能写一个例子吗?
如果没有 - 是否有在 scala 类上运行 JSR-303 验证的变通方法?
【问题讨论】:
-
我找到了Accord 用于验证的开源库。
标签: scala bean-validation
scala 是否支持 JSR-303 验证?
如果是的话 - 你能写一个例子吗?
如果没有 - 是否有在 scala 类上运行 JSR-303 验证的变通方法?
【问题讨论】:
标签: scala bean-validation
当然!
然而,Scala 类型需要自定义注解,以及对集合的自定义处理。
如果有兴趣,我会开源我的实现。
【讨论】:
有好消息也有坏消息。
好消息是您可以毫无问题地在 Scala 代码中使用 JSR-303 注释。
这是我之前项目中的一个示例,其中所有注释都是 JSR-303 注释,其中一些是开箱即用的,其中一些是自定义的。
@MessagesValid
class Messages {
@NotEmpty @Valid
private var msgs: java.util.List[DeliveredMessage] = _
def messages = msgs.asScala
@ChannelValid
var channel: String = _
var emailFrom: String = _
var emailReplyTo: String = _
@PublishAtValid
var publishAt: String = _
}
请注意msgs 集合如何是java.util.List。它必须是一个 Java 集合,@NotEmpty 和 @Valid 才能工作。但是使用 JavaConverters 将该字段公开为 Scala 集合很容易。
坏消息是您无法使用 Scala 创建 JSR-303 注释。您必须使用 Java 编写这些注释。因此,如果您想编写自定义 JSR-303 注释,则需要有一个混合的 Scala/Java 项目。
There is an old bug(错误 #32!)在 Scala 错误跟踪器中支持这些类型的注释,但它目前因无法修复而关闭。无论如何,请投票。
【讨论】:
@Constraint(validatedBy = ScalaCustomerValidator.class) 时,它给出了 Type mismatch: cannot convert from Class<ScalaCustomerValidator> to Class<? extends ConstraintValidator<?,?>>[] 的编译错误。我的 ScalaCustomerValidator 确实扩展了 ConstraintValidator