我正在编写一个包含域模型的库,并使用Bean Validation API。我的目标是拥有最少量的依赖项。因此,没有CDI,Java EE和Spring。允许的依赖关系仅适用于API,如JSR-349和JSR-330 API。
我不能对我的图书馆将如何使用做出任何假设。它可能位于容器内或桌面应用程序中。强制库用户拥有CDI,Spring或验证实现不是一种选择。
现在,我使用bean验证API来允许我的库用户验证模型本身。但我还想在某些情况下使用方法验证。
我的问题是:
如果我想在a中使用方法验证,我有哪些选项? 图书馆项目?
我是否必须使用aspectj运行时依赖项运送我的库?
在域模型中使用方法验证是否有意义?
答案 0 :(得分:0)
您的图书馆将如何使用?有可能使用它的应用程序无论如何都在CDI,Spring或其他类型的容器中运行,然后将方法验证委托给它们是明智的。
如果您真的想要自己的解决方案,那实际上取决于您的域模型的实例是如何创建的。如果您有接口并且用户通过工厂获取实例,那么您可以查看JDK动态代理。或者,如果您不使用接口但使用类,则可以查看Javassist或Cglib。这仍然要求您通过工厂获取您的域模型节点,以便返回正确代理的实例。
是否有意义取决于您的具体型号及其用例。在验证模型时,属性(和类级别)验证肯定是更常见的情况,但如果您在模型上提供业务方法并想要验证其参数或返回值,则可能有意义。
答案 1 :(得分:0)
1)没有CDI我会推荐apache BVal或任何不需要进行容器管理的jsr303特定实现。
由于jsr以java-ee平台为目标,因此某些容器似乎必须对其进行管理。您选择的容器取决于应用程序必须附带的额外依赖项。
Bval本身不需要任何其他核心apache帮助程序库。
2)bs和jsr303规范的其他实现需要某种java ee容器。它是java ee背后的后盾原则。如果没有java-ee环境,bval将需要一个di框架来挂钩。
如果选择guice作为容器;它使用cglib作为其字节码,并使用aop联盟接口作为其aop(在cglib的帮助下内部实现)。
Spring确实需要aspectj。
如果选择CDI,则取决于所使用的CDI实现。
3)如果您只是尝试进行方法级别验证,那么只需在类setter / getter本身中手动进行验证即可。特别是如果你想保持平台独立。
通过使用第三方库进行方法级别验证仅在使用第三方容器时才有意义。如果您正在尝试使用基本的简单java se应用程序,那么将验证放在数据对象本身并让您的异常处理策略为用户处理问题确实很有意义。
对三个人的回答总是相当主观的,但如果你真的不想使用大量的框架,我不会认为在方法本身进行验证是不好的做法。