【问题标题】:How to validate if a foreign key entry exists?如何验证是否存在外键条目?
【发布时间】:2012-01-27 14:38:33
【问题描述】:

我的Customer 表中有外键。

@JoinColumn(name = "DISCOUNT_CODE", referencedColumnName = "DISCOUNT_CODE")
@ManyToOne(optional = false)
private DiscountCode discountCode;

我有一个包含该表所有字段的表单(包括外键discountCode 及其来自另一个表的描述)。

如果用户输入了外键表中不存在的输入,我希望能够显示该外键不存在的消息。 当我对这个字段进行模糊处理时,我会从表中检索它的描述。当用户对无效字段进行模糊处理并且表格中不存在时,如何显示无效字段的错误消息?

【问题讨论】:

  • 作为替代方案,您也可以只使用(自动完成)下拉字段而不是文本字段。至少,预定义的值应该由下拉菜单显示。
  • @BalusC:我在这个表中有很多字段,所以我不想有一个下拉字段,里面会有超过 1000 条记录......
  • 这正是我建议“自动完成”的原因:)

标签: jsf jpa jsf-2 jpa-2.0


【解决方案1】:

您需要的是Validator。它应该是这样的:

@ManagedBean
@RequestScoped
public class DiscountCodeValidator implements Validator {
    @EJB
    private MrBean mrBean;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String discountCode = (String) value;

        if (!mrBean.checkDiscountCodeExistence(discountCode)) {
            throw new ValidatorException(new FacesMessage("This code is not valid!"));
        }
    }
}

在您的 .xhtml 文件中,您可以如下声明此验证器:

<h:inputText id="discountCode" value="#{someBean.discountCode}" 
             validator="#{discountCodeValidator}" 
             required="true" requiredMessage="Discount code is required.">
   <f:ajax event="blur" render="discountMsg" />
</h:inputText>
<h:message for="discountCode" id="discountMsg"/>

需要注意的一点是,我假设您将注入一个 EJB 以使用 checkDiscountCodeExistence() 函数检查折扣代码是否存在。因此,我将上述验证器注释为@ManagedBean。如果不需要注入任何 EJB,可以在 Validator 上注解 @FacesValidator

【讨论】:

  • 感谢您的回答。没有Validator 有没有办法解决这个问题?我可以在我的托管或会话 bean 中执行它吗? (所以我不必定义validator)。再次感谢。
  • 当然可以。假设您的 ManagedBean 是 mrBean,您可以将 public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException 函数直接放在该 bean 中。之后,您只需要使用validator="#{mrBean.validate}" 声明验证器即可。
  • 谢谢,效果很好。我对这个问题还有另一个问题,如何从.properties 文件中设置默认消息,而不是像您的示例中那样编写new FacesMessage("This code is not valid!")?谢谢。
  • 嗯....我以前从未这样做过。我猜你需要一些函数来在应用程序启动时读取整个 .properties 文件,并将所有属性放入一些变量中,然后在需要的地方使用它。
  • 好吧,我会深入研究它..我忘了问的另一件事。当我的字段值无效时,我正在显示消息,我还想将焦点设置在该字段上,以便用户在将字段更改为有效字段之前无法继续。我怎样才能做到这一点?再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2013-09-18
  • 2020-01-18
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多