mpu*_*ktw 4 java facade bean-validation jakarta-ee
我尝试在标准 AbstractFacade(由 NetBeans 生成)的创建和编辑方法上添加参数约束配置(bean 验证)。
所以我尝试:
@Override
public void create(@WkTeilnahmePlanedResult WkTeilnahme entity) {
super.create(entity);
}
Run Code Online (Sandbox Code Playgroud)
这返回了消息
将覆盖另一个方法的方法部署到 Glassfish 4 时不得更改参数约束配置
所以接下来的尝试是
@Override
public void create(WkTeilnahme entity) {
checkedCreate(entity);
}
private void checkedCreate(@WkTeilnahmePlanedResult WkTeilnahme entity) {
super.create(entity);
}
Run Code Online (Sandbox Code Playgroud)
部署没有任何问题......但验证器从未被调用。
你能告诉我为什么吗?
顺便提一句:
@Override
public void create(WkTeilnahme entity) {
throw new UnsupportedOperationException(
"Create not supported! Use checkedCreate() instead!");
}
public void checkedCreate(@WkTeilnahmePlanedResult WkTeilnahme entity) {
super.create(entity);
}
Run Code Online (Sandbox Code Playgroud)
这可行,但并不是很酷!
关于您的第一次尝试,它不起作用,因为 Bean Validation 约束必须遵循Liskov Substitution Principle。另请参阅相关的 Bean 验证规范部分 - http://beanvalidation.org/1.1/spec/#constraintdeclarationvalidationprocess-methodlevelconstraints-inheritance
从规格来看:
非常通俗地说,里氏替换原则表示,在使用给定类型 T 的情况下,应该可以用 T 的子类型 S 替换 T(“行为子类型”)。如果 S 覆盖/实现 T 中的方法,并且 S 会加强该方法的先决条件(例如,通过添加参数约束),则将违反此原则,因为针对 T 正确工作的客户端代码在针对 S 工作时可能会失败。此外,如果 S 覆盖/实现方法T 和 S 削弱了方法的后置条件,这一原则将被违反。然而,S 可能会加强方法的后置条件(通过添加返回值约束),因为针对 T 工作的客户端代码仍然会针对 S 工作。
我认为您的第二个示例应该实际有效,但是,我不熟悉 NetBeans AbstractFacade。我的猜测是对checkedCreate(entity)的调用;不通过代理实例,因此不会被拦截。也许您可以发布相关类的完整代码?什么类型的类包含这些方法?会话 bean?
| 归档时间: |
|
| 查看次数: |
15328 次 |
| 最近记录: |