【问题标题】:parameter validation with net.sf.oval (in play framework)使用 net.sf.oval 进行参数验证(在游戏框架中)
【发布时间】:2011-12-19 13:55:34
【问题描述】:

我很想将@NotNull 注释(或@Required 或任何东西)用于我自己的方法。虽然这在 Controller 和 Model 类中工作得很好,但我无法让它在我自己的情况下工作。这可能更像是一个 net.sf.oval 问题,然后是游戏框架。但它可能是连接的,我不知道。

我有这样的课:

@net.sf.oval.guard.Guarded
public class SimulatorWrapper {

    public SimulatorWrapper setRedCode(@play.data.validation.Required @net.sf.oval.constraint.NotNull final String redCode) {
        // just gessing here:
        if(Validation.hasErrors()) throw new RuntimeException("invalid argument");
        if(redCode == null) throw new RuntimeException("null");
        // do stuff
        return this;
    }
}

当我使用 null 参数调用此方法时,if 会引发我的异常,但 @NotNull 和 @Required 似乎什么都不做。我究竟做错了什么? play 框架项目自带了 1.5 的椭圆,我下载了 1.8 并将其添加到 eclipse 中的类路径中,以防旧的有问题。

我用“play test my-server”启动服务器,然后用浏览器导航到我的网站(还不是测试,只是简单的网站)。

谢谢,亚历克斯

附:我知道“null is evil”的讨论,但我无法访问其余代码,所以我无法更改。

【问题讨论】:

    标签: validation playframework oval


    【解决方案1】:

    只有在调用控制器动作时,Play 框架才会调用验证类来检查验证注释。

    由于您不在控制器中,因此不会执行 Validation on annotation,Required annotion 不会在 Validation.hasErrors()

    您可以使用以下方法,而不是使用注解: Validation.required(redCode); //它会检查null 之后,调用 Validation.hasErrors() 它应该可以工作。

    但是,我认为您不应该这样做,因为来自 Validation.hasError() 的错误应该来自控制器操作调用上的 Validation,它可能会给您带来副作用。

    如果你想做类似你的例子的事情,你不应该依赖 play Validation 类。

    您确定在正确的地方使用验证吗?

    【讨论】:

    • 嗨,首先感谢您的回复。当然,这是使用验证的错误地方,但我正在处理我无法更改的非常愚蠢的代码,所以我想将@NotNull 添加到我函数的几乎每个参数中。 (未来可能会有更多限制)。
    • hups 输入发送它。所以无论如何,我正在考虑使用 net.sf.oval - 这不是那个库的目的吗?因为正如您所说,播放验证仅适用于控制器和模型。目前我有很多很多“if(... == null) throw ...”
    • 我现在要 void test(@NotNull String a) { new Validator().assertValid(a); } 如果我通过 null 则失败。但这与使用 if null then throw 几乎相同。据我了解,我需要使用 aspectj 编译器进行自动验证,但我找不到任何关于如何使用 play 框架来做到这一点。
    • 我认为 play 想要远离 aspectJ 之类的东西,因为它太复杂了。也许你也可以使用 Enhancer 来为你的类添加东西,但是没有官方文档,所以它会更加困难。框架中有几个增强器,您可以将其用作示例,例如:LocalvariablesNamesEnhancer
    • 啊,谢谢,这让我想到了 Javassist,我终于决定那太不值得了! :D 可能会在未来的某个时间使用 aspectj,以防它变得更受欢迎(听起来真的很不错)
    【解决方案2】:

    万一还有人需要这个。

    您可以在所有类中使用 Play 注释进行验证,其方式与在控制器中完全相同。 只需使用validate 插件即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2023-03-19
      相关资源
      最近更新 更多