Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 如何验证外键条目是否存在?_Jsf_Jpa_Jsf 2_Jpa 2.0 - Fatal编程技术网

Jsf 如何验证外键条目是否存在?

Jsf 如何验证外键条目是否存在?,jsf,jpa,jsf-2,jpa-2.0,Jsf,Jpa,Jsf 2,Jpa 2.0,我的客户表中有外键 @JoinColumn(name = "DISCOUNT_CODE", referencedColumnName = "DISCOUNT_CODE") @ManyToOne(optional = false) private DiscountCode discountCode; 我有一个表单,其中包含该表的所有字段(包括外键discountCode及其来自另一个表的描述) 如果用户输入了外键表中不存在的输入,我希望能够显示一条消息,说明该外键不存在。 当我模糊这个字段时,我

我的
客户
表中有外键

@JoinColumn(name = "DISCOUNT_CODE", referencedColumnName = "DISCOUNT_CODE")
@ManyToOne(optional = false)
private DiscountCode discountCode;
我有一个表单,其中包含该表的所有字段(包括外键
discountCode
及其来自另一个表的描述)

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

您需要的是一个
验证器。应该是这样的:

@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,您可以使用
@FacesValidator

对验证器进行注释,作为替代,您也可以使用(自动完成)下拉字段而不是文本字段。至少,预定义的值应该用下拉列表显示。@BalusC:我在这个表中有很多字段,所以我不希望有一个下拉字段,因为它里面有超过1000条记录……这正是我建议“自动完成”的原因:)谢谢你的回答。。没有
验证器
,有没有办法做到这一点?我可以在托管bean或会话bean中的函数中完成它吗?(因此我不必定义
验证器
)。再次感谢你,你当然可以。假设您的ManagedBean是
mrBean
,您可以将
public void validate(FacesContext上下文、UIComponent组件、对象值)抛出ValidatorException
函数直接放在该bean中。之后,您只需使用
validator=“#{mrBean.validate}”
声明验证器。谢谢,它工作得很好。关于此问题,我还有另一个问题,如何从
.properties
文件设置defult消息,而不是像您的示例中那样编写
新面孔消息(“此代码无效!”)
?谢谢。。。。我以前从未这样做过。我想你需要一些函数来读取整个.properties文件,无论应用程序何时启动,并将所有属性放入一些变量中,然后在需要的地方使用它。好的,我将深入研究它。。还有一件事我忘了问。当我的字段值未验证时,我将显示消息,我还希望将焦点设置在此字段上,以便用户在将字段更改为有效字段之前无法继续。我该怎么做?再次感谢你!