当前位置: 首页 > 知识库问答 >
问题:

验证程序JSF中的EJB bean

凌运恒
2023-03-14

我想验证社会安全号码是否存在于数据库中。这是我的验证器。

@RequestScoped
@FacesValidator("personalIdValidator")
public class PersonalIdValidator implements Validator {

    @EJB
    private UserDaoLocal userDao;

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

        boolean ok;
        String personalId = value.toString();
        String regex = "[0-9]{11}";
        ok = Pattern.matches(regex, personalId);

        if (!ok || userDao.findUserExist(personalId)) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Błędny pesel", "Błędny pesel"));
        }
    }
}

在Validator中,我有一个@EJB userDao,我有一个方法userDao。findUserExist(personalId)此方法:

@Override
public boolean findUserExist(String personalId) {
    try {
        Query q = em.createQuery("SELECT u FROM User u WHERE u.personalId = :personalId");
        q.setParameter("personalId", personalId);
        user = (User) q.getSingleResult();
        if(user == null) {
            return false;
        } else {
            return true;
        }

    } catch (Exception e) {
        System.out.println("Błąd" + e.getMessage());
        return false;
    }
}

但是当我执行此方法时,我有一个错误:

警告:StandardWrapperValve[面向Servlet]:PWC1406:Servlet。servlet Faces的service()servlet引发了异常java。pl.ePrzychodnia处的lang.NullPointerException。验证器。PersonalIdValidator。在javax上验证(PersonalIdValidator.java:41)。面。组成部分UIInput。javax上的validateValue(UIInput.java:1149)。面。组成部分UIInput。在javax上验证(UIInput.java:967)。面。组成部分UIInput。javax上的executeValidate(UIInput.java:1233)。面。组成部分UIInput。javax上的processValidators(UIInput.java:698)。面。组成部分UIComponentBase。javax上的processValidators(UIComponentBase.java:1214)。面。组成部分UIComponentBase。org上的processValidators(UIComponentBase.java:1214)。基本面。组成部分面板面板javax上的processValidators(Panel.java:297)。面。组成部分UIForm。javax上的processValidators(UIForm.java:253)。面。组成部分UIComponentBase。javax上的processValidators(UIComponentBase.java:1214)。面。组成部分UIComponentBase。javax上的processValidators(UIComponentBase.java:1214)。面。组成部分UIViewRoot。com上的processValidators(UIViewRoot.java:1172)。太阳面。生命周期。ProcessValidationsPhase。在com上执行(ProcessValidationsPhase.java:76)。太阳面。生命周期。阶段com上的doPhase(Phase.java:101)。太阳面。生命周期。生命周期impl。在javax上执行(LifecycleImpl.java:118)。面。webapp。FacesServlet。org上的服务(FacesServlet.java:593)。阿帕奇。卡特琳娜。果心标准包装器。org上的服务(StandardWrapper.java:1550)。阿帕奇。卡特琳娜。果心标准包装阀。在org上调用(StandardWrapperValve.java:281)。阿帕奇。卡特琳娜。果心标准上下文阀。在组织中调用(StandardContextValve.java:175)。阿帕奇。卡特琳娜。果心标准管道。doInvoke(StandardPipeline.java:655)位于org。阿帕奇。卡特琳娜。果心标准管道。在组织中调用(StandardPipeline.java:595)。阿帕奇。卡特琳娜。果心标准主阀。在组织中调用(StandardHostValve.java:161)。阿帕奇。卡特琳娜。连接器。郊狼适应者。doService(CoyoteAdapter.java:331)位于org。阿帕奇。卡特琳娜。连接器。郊狼适应者。com上的服务(CoyoteAdapter.java:231)。太阳企业v3.服务。实施。ContainerMapper$AdapterCallable。请致电com(ContainerMapper.java:317)。太阳企业v3.服务。实施。集装箱包装机。com上的服务(ContainerMapper.java:195)。太阳灰熊http。处理器任务。com上的invokeAdapter(ProcessorTask.java:860)。太阳灰熊http。处理器任务。com上的doProcess(ProcessorTask.java:757)。太阳灰熊http。处理器任务。com上的进程(ProcessorTask.java:1056)。太阳灰熊http。DefaultProtocolFilter。在com上执行(DefaultProtocolFilter.java:229)。太阳灰熊默认协议链。com上的executeProtocolFilter(DefaultProtocolChain.java:137)。太阳灰熊默认协议链。在com上执行(DefaultProtocolChain.java:104)。太阳灰熊默认协议链。在com上执行(DefaultProtocolChain.java:90)。太阳灰熊http。HttpProtocolChain。在com上执行(HttpProtocolChain.java:79)。太阳灰熊ProtocolChainContextTask。com上的doCall(ProtocolChainContextTask.java:54)。太阳灰熊SelectionKeyContextTask。在com上调用(SelectionKeyContextTask.java:59)。太阳灰熊上下文任务。在com上运行(ContextTask.java:71)。太阳灰熊util。AbstractThreadPool$Worker。com上的doWork(AbstractThreadPool.java:532)。太阳灰熊util。AbstractThreadPool$Worker。在java上运行(AbstractThreadPool.java:513)。lang.Thread。运行(Thread.java:722)

共有1个答案

阎晋
2023-03-14

第一个:

替换

String personalId = value.toString();

通过

String confirm = (String) component.getAttributes().get("theInputFromYourPage");

您也可以尝试以下操作:

private static final String regex = "[0-9]{11}";
private Pattern pattern;
private Matcher matcher;

public PersonalIdValidator() {
    pattern = Pattern.compile(regex);
}

public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {
    // TODO Auto-generated method stub
    matcher = pattern.matcher(value.toString());
    if (!matcher.matches()) {


        // DO YOUR STUFF QUERY


    } else {
                    // FacesMessages, invite the user to respect regex [0-9]{11}
            }
}
 类似资料:
  • 问题内容: 我想用Java验证HTML代码。 像这样: 有哪些Java库可以做到这一点? 问题答案: 您可以尝试JTidy。JTidy是HTML Tidy的Java端口,HTML Tidy是HTML语法检查器和漂亮的打印机。 http://jtidy.sourceforge.net/

  • 主要内容:验证器标签JSF有内置的验证器验证其UI组件。验证器标签可以验证可以是自定义对象的字段长度,输入类型。 我们必须在节点中使用URI的以下命名空间来包含验证器标签。 验证器标签 下表在JSF 2.0中有重要的验证器标签: 标签 描述 验证字符串的长度 验证数值范围 验证浮点值的范围 使用给定的正则表达式验证JSF组件。 自定义验证器 创建自定义验证器

  • 主要内容:标签属性,JSF验证整数范围实例标签用于验证特定范围内的长值。 以下代码显示如何使用标记 - 标签属性 属性 说明 minimum 在可选范围内最小长度值 maximum 在可选范围内最大长度值 JSF验证整数范围实例 打开 NetBeans IDE 创建一个Web工程:ValidateIntRange,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文件:result.xhtml

  • 我尝试将JSF与Bean验证结合使用。基本上,一切正常,验证工作如预期,我得到了正确的消息,但我的Glassfish控制台上有一个例外: 如果我使用自定义约束和预定义约束,则会发生此异常。 这是我的示例代码。 示例实体: 自定义约束: 自定义验证器: 样品控制器: jsf页面示例: MyEntityFacade仅从实体管理器进行持久化调用。 如前所述,应用程序运行良好,正确的消息已显示,但我希望在

  • 问题内容: 我在PRG模式下使用JSF。(在我的导航规则中使用)。 问题是,当我收到验证错误(例如:用户未设置强制值)时,重定向未完成(即,帖子后跟随同一页面)。 该方案是: 用户未输入强制值并提交表单 发生验证错误,并且显示同一视图并显示一条错误消息(无PRG) 用户设置强制值并提交==> GO到下一页(带有PRG) 用户单击后退按钮=>问题,因为在步骤2中未执行PRG。==>在Firefox中

  • 我正在使用带有PRG模式的JSF。(在我的导航规则中使用)。 问题是,当我收到验证错误(例如:用户未设置强制值)时,重定向没有完成(即,一篇文章后面跟着同一页的get)。 情况是: > 用户没有输入强制值并提交表单 发生验证错误,同一视图显示错误消息(无PRG) 用户设置强制值并提交== 用户点击后退按钮= 谁能帮帮我吗? 提前感谢。 斯特凡