问题描述
在我工作的公司,我们正在使用JSF2和PrimeFaces实现Web应用程序。 Web应用程序是一系列业务方法的前端之一,以及作为一组实体类创建的域模型,并使用JPA进行持久化。我们还有一些web服务方法在同一个域模型上运行。因此,我们希望在实体级别上使用bean验证尽可能多地实现验证逻辑。到目前为止,一切都很顺利,但我们最近碰到了一个我不知道如何应对的问题。为了改善用户体验,我们使用AJAX触发大多数bean验证逻辑(使用p:ajax update =" errorMessageForFieldWhatever"),例如当用户选中文本字段时,更改下拉列表中的值等等,以便他们立即得到有关错误的反馈。这在处理字段/属性级约束时工作正常,但我不知道如何使它与类级别的bean验证器一起正常工作。让我举一个例子来说明。 假设以下实体对象,CDI bean和facelets视图,以及要求MaxValue大于MinValue的自定义bean验证器。
@Entity
@CustomClassLevelBeanValidator
public class Model {
@Min(10) int minValue; int maxValue; // getters/setters ommitted }
@Named
@SessionScoped
public class ModelBean {
@Valid private Model model; // getter and initialization ommitted }
<f:form>
min value:
<p:inputText id="minValue" value="#{modelBean.model.minValue}">
<p:ajax process="@this" update="minValueErrorMessage"/>
</p:inputText>
<p:message for="minValue" id="minValueErrorMessage"/>
max value:
<p:inputText id="maxValue" value="#{modelBean.model.maxValue}"/>
<p:message for="maxValue"/>
</f:form>
我们想要实现的目标如下:
目前的事态
解决方案要求
理想的解决方案将满足以下所有要求:
从哪里开始?
据我所知,JSF,BeanValidation或PrimeFaces中的任何内容都没有让我实现这一目标。我对ExtVal不太确定,它似乎设计得非常可扩展,但即便如此,我也不知道从哪里开始。如果我完全忽略了这些库中的任何内容并让我解决了这个问题,请告诉我! 如果没有,那么为这个问题构建自定义解决方案需要什么?我已经考虑过手动实现这个,类似于自定义阶段,它会触发当前视图中所有提交字段的所有bean验证器,并将它们转换为FacesMessages。但我怀疑这不是一件容易的事:
我想到的时间越长,我越怀疑它不会按照我想要的方式工作。我仍然觉得有点愚蠢,不得不告诉我们的用户&#34;不抱歉,结束日期必须在开始日期之后是如此复杂的业务规则,我们无法直接提供反馈,您只会遇到该错误你提交整个表格。&#34;因此,如果有人提出满足所有要求的解决方案,我将非常感激听到它。