跨域 bean 验证 - 为什么你不工作

2024-03-29

我的应用程序遇到了一点问题。我想检查字段密码和确认密码是否匹配,所以我尝试像这个问题的第一个答案中那样进行操作:使用 Hibernate Validator (JSR 303) 进行跨领域验证 https://stackoverflow.com/questions/1972933/cross-field-validation-with-hibernate-validator-jsr-303

问题是它实际上不起作用,我不知道为什么。请帮我!这是我在这里的第一篇文章,所以请不要对我太严厉。

这是我的注释:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints;

import java.lang.annotation.*;
import javax.validation.Constraint;
import javax.validation.Payload;

/**
 *
 * @author lukasz
 */
@Documented
@Constraint(validatedBy = FieldMatchValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldMatch {

String message() default "{pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.FieldMatch}";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

String first();

String second();
}

这是我的验证器类:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints;

import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.beanutils.BeanUtils;

/**
 *
 * @author lukasz
 */
public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object> {

    private String firstFieldName;
    private String secondFieldName;

    @Override
    public void initialize(FieldMatch constraintAnnotation) {
        firstFieldName = constraintAnnotation.first();
        secondFieldName = constraintAnnotation.second();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        try {
            String sFirstField = BeanUtils.getProperty(value, firstFieldName);
            String sSecondField = BeanUtils.getProperty(value, secondFieldName);
            if(sFirstField.equals(sSecondField)){
                return true;
            }
        } catch (IllegalAccessException ex) {
            Logger.getLogger(FieldMatchValidator.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
        Logger.getLogger(FieldMatchValidator.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchMethodException ex) {
        Logger.getLogger(FieldMatchValidator.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
}

这是我的豆子:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.lodz.p.zsk.ssbd2012.ssbd12.Beans;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.CheckEmail;
import pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.FieldMatch;
import pl.lodz.p.zsk.ssbd2012.ssbd12.entities.Account;
import pl.lodz.p.zsk.ssbd2012.ssbd12.mok.endpoint.MokEndpointLocal;

/**
 *
 * @author krzys
 * @author lukasz
 */

@ManagedBean
@RequestScoped
@FieldMatch(first = "password", second = "password2", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.FieldMatch}")
public class RegisterBean {

    /**
     * Creates a new instance of RegisterBean
     */

    @EJB
    MokEndpointLocal endpoint;

    @Size(min = 3, max = 16, message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.login.size}")
    @Pattern(regexp = "[a-zA-Z0-9]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.login.invalid}")
    private String login;

    @Size(min = 6, max = 64, message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.password.size}")
    @Pattern(regexp = "[a-zA-Z0-9]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.password.invalid}")
    private String password;

    private String password2;

    @Pattern(regexp = "[A-Ż][a-ż]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.name.invalid}")
    private String name;

    @Pattern(regexp = "[A-Ż][a-ż]+", message = "{pl.lodz.p.zsk.ssbd2012.ssbd12.Beans.RegisterBean.surname.invalid}")
    private String surname;

    @CheckEmail
    private String email = "";


    /**
     * @return the login
     */
    public String getLogin() {
        return login;
    }

    /**
     * @param login the login to set
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword2() {
        return password2;
    }

    public void setPassword2(String password2) {
        this.password2 = password2;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String register ()
    {
//       Account account = new Account();
//       account.setLogin(login);
//       account.setHaslo(password);
//       account.setImie(name);
//       account.setNazwisko(surname);
//       account.setEmail(email);
//       endpoint.register(account);
       return "registerSucces";
    }

    /**
     * @return the surname
     */
    public String getSurname() {
        return surname;
    }

    /**
     * @param surname the surname to set
     */
    public void setSurname(String surname) {
        this.surname = surname;
    }
}

这是 JSF:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <h:outputStylesheet name="menu.css" library="css" />
    <title>#{messages.registration}</title>
</h:head>

<h:body>
    <ui:composition template="./../resources/mainTemplate.xhtml">

        <h4>#{messages.registration}</h4>
    <ui:define name="content">
        <h4>#{messages.registration}</h4>
        <h1>#{messages.registrationInfo1}</h1>
    #{messages.registrationInfo2}
    <h:form>
        <h2>
            <h:outputText value="#{messages.loginForm}"/>
            <h:inputText id="login" value="#{registerBean.login}" />  
        </h2>
        <h2>
            <h:outputText value="#{messages.passwordForm}" />
            <h:inputSecret id="password" value="#{registerBean.password}" />
        </h2>
        <h2>
            <h:outputText value="#{messages.repeatPasswordForm}"/> 
            <h:inputSecret id="confirm" value="#{registerBean.password2}" />
        </h2>
        <h2>
            <h:outputText value="#{messages.nameForm}"/>
            <h:inputText id="name" value="#{registerBean.name}" />
        </h2>
        <h2>
            <h:outputText value="#{messages.surnameForm}"/>
            <h:inputText id="surname" value="#{registerBean.surname}" />
        </h2>
        <h2>
            <h:outputText value="#{messages.emailForm}"/>
            <h:inputText id="email" value="#{registerBean.email}" />
        </h2>
        <h2>    
            <h:commandButton value="#{messages.send}" action="#{registerBean.register()}" />
        </h2>
    </h:form>
    </ui:define>
    </ui:composition>
</h:body>
</html>

在验证阶段,JSF 不会自动触发类级别约束。您只能使用字段级约束(而且 JSF 不会评估所有字段,而只会评估 Facelet 中的字段)。

如果您想使用 bean 验证,您可以手动执行验证:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Test>> violations = validator.validate( this, Default.class );

您可以在 bean 的注册方法中或在更新模型阶段之后执行此操作(但我从未尝试过)。

无论如何,您可以使用 JSF 验证而不是 bean 验证,或者直接在注册方法中检查密码:

public String registration() {
    ...

    if ( !password.equals(password2) ) {
        FacesContext.getCurrentInstance().addMessage( null, new FacesMessage( "Passwords do not match" ) );
        return null;
    }

    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨域 bean 验证 - 为什么你不工作 的相关文章

  • 以编程方式创建验证列表

    我有一组从外部源进入 VBA 代码的数据 我希望能够分配该数据以用作此工作簿中一张工作表的单元格下拉框中的验证 但是 我不想将该数据复制到工作表中 然后使用命名范围 可能有相当多的数据 而且这感觉不是很有效 我确信一定有办法 但我还没有找到
  • ASP.NET MVC 的验证选项有哪些

    net mvc 的验证选项有哪些 他们中的任何一个都有像 Webforms 那样的很好的验证摘要吗 您可以使用 MVC html 验证摘要 请参阅此博客 http blog maartenballiauw be post 2008 08 2
  • 使用 JSF2 包含上下文根之外的资源

    我目前正在将应用程序从 JSF 1 2 和 Richfaces 3 3 升级到 JSF 2 和 Richfaces 4 我在使用 JSF2 的新功能让我的应用程序包含样式表时遇到问题h 输出样式表 http download oracle
  • 如何在 PHP 中验证电子邮件? [复制]

    这个问题在这里已经有答案了 如何使用 php5 验证输入值是有效的电子邮件地址 现在我正在使用这段代码 function isValidEmail email pattern a z0 9 a z0 9 a z0 9 a z0 9 a z
  • Codeigniter 使用表单验证函数“匹配”子数组 POST

    上周刚开始使用 CI 并遇到了这个问题 里面要放什么matches如果我将表单数据作为数组传递 函数会怎样 我使用 html 表单中的数组来定位单个数组内的所有输入字段 以防我想传递用户生成的输入 例如多个电话号码或电子邮件 所以所有东西都
  • HTML 表单检查空字段

    我已经在 HTML 表单中实现了输入验证 但是 如果出现任何错误 它不会提示用户 并且仍然继续将其数据发送到测试服务器 下面是我的代码
  • 如何禁用单个视图的客户端验证?

    我需要在单个视图上禁用表单的客户端验证 我该怎么做呢 我不想只禁用以下 JS 文件 Scripts jquery jquery validate min js type text javascript gt Scripts jquery j
  • 使用 Java 根据本地 DTD 文件验证 XML 文件

    如何根据本地存储为文件的 DTD 验证 XML 文件 XML 文件没有任何 DOCTYPE 声明 或者可能有一个应该被覆盖的声明 我看了一下这个线程 https stackoverflow com questions 470313 net
  • 将默认消息“验证错误:需要值”更改为“需要值”

    我可以修改这个默认值吗required true 验证消息仅显示 需要值 formId inputId 验证错误 值是必需的 Either使用输入组件的requiredMessage属性
  • LINQ2SQL:如何实现通用最大字符串长度验证?

    LINQ2SQL 中的一个常见问题是 虽然 NET 字符串允许为其变量分配任意长度 但您的数据库可能具有特定的最大长度约束 如 VARCHAR 5 这将导致 SQL 错误消息 字符串或二进制数据将被截断 这是非常没有帮助的 因为它不会告诉您
  • WPF DataGrid 验证错误?

    这可能是预期的功能 但对我来说它确实像是一个错误 我正在使用开箱即用的 WPF DataGrid 绑定到 ObservableCollection 和尝试使用一些验证规则来提供良好的用户反馈 不用说 问题多得我数不过来 但我会坚持眼前的问题
  • JQuery 在提交之前需要复选框和单选按钮

    我很难弄清楚这一点 现在我们已经花了 3 个多小时来研究 JQuery 验证的示例和工具 我想做的只是要求选中一个复选框和一个单选按钮 但我不在乎需要哪一个
  • JSF 1.2:如何在同一视图上的回发中保持请求范围的托管 bean 处于活动状态?

    是否可以在同一页面上的回发过程中保持请求作用域的 bean 处于活动状态 一般的问题是 bean 在请求结束时被丢弃 并在每次表单提交时重新创建 例如动态操作背后的布尔值disabled readonly and rendered重置为默认
  • Spring Cloud Stream 和 Hibernate 验证器

    最近 我一直在玩Spring Cloud Stream的最后一个版本 使用其函数式编程风格 虽然我已经读完了全文文档 https cloud spring io spring cloud static spring cloud stream
  • 如何获取 JSF 2 中所有会话范围的 bean?

    据我所知 JSF 将所有会话范围 bean 保存在某种 Map 中 如果我错了 请纠正我 在我的应用程序中 我有一个名为 userDetailsBean 的会话范围 由 Spring 管理并注入到支持 bean 中 bean 是否有可能通过
  • 你把你的验证放在 asp.net mvc 3 的哪里?

    ASP NET MVC 中一种常见的推荐做法是您不应该将您的商业模式发送到您的视图中 http lostechies com jimmybogard 2009 06 30 how we do mvc view models 相反 您应该创建
  • Maven安装错误找不到javax.el.E​​LContext和找不到javax.el.E​​LResolver

    我正在使用 Maven 3 和 JDK 1 7 当我尝试做的时候mvn install 我收到以下错误 ERROR domain view EmployeeNameConverter java 29 76 cannot access jav
  • 如何在 WTForms 中使字段有条件可选?

    我的表单验证工作已接近完成 我只有两种情况 我不知道具体如何解决 1 密码字段当然应该是必需的 但我还提供了通过 OAuth 使用 google 或 facebook 帐户登录的可能性 然后名称被预先填充 但我从表单中完全删除密码字段是否有
  • f:ajax 不工作

    我很难得到f ajax从事某项工作h panelGroup 这就是我正在做的 JSF 代码
  • 阻止表单 POSTing,直到 javascript 代码得到满足

    每当我点击提交按钮时它就会触发alert empty username 但直接引导我去checklogin php 我怎样才能避免这种情况并让它保留在页面上 除非该字段不为空 function RequiredFields var user

随机推荐

  • 将 Leaflet 与 Ionic2 typescript 一起使用

    我是新来的Ionic2 and Angular2 with 打字稿我想为 iOS 和 Android 构建一个移动应用程序 下一步我想包括一张地图并找到Leaflet 在 GoogleMaps 和 OSM 之间轻松更改 所以 我的问题从安装
  • MSBuild条件编译

    我有一个 Web 服务类 框架的其余部分依赖它来获取其数据 但是 Web 服务类需要根据其所处的环境具有不同的方法属性 例如 SoapDocumentMethodAttribute https example public string T
  • 在内存中运行 Docker?

    据我了解 Docker 使用内存映射文件从镜像启动 由于我可以一遍又一遍地执行此操作 并且据我记得并行启动同一图像的不同实例 我猜 docker 抽象了文件系统并将更改存储在其他地方 我想知道 docker 是否可以配置 或者默认情况下 以
  • 从一个 Visual Studio 实例调试程序的多个副本

    我有一个 pre alpha GUI 程序内部测试 http en wikipedia org wiki Eat one 27s own dog food并希望在调试器下运行 当出现问题时 但我不想为应用程序的每个实例启动 Visual S
  • 如何检测网格单元格中的点击并更改其颜色?

    对 python 相当陌生 并试图重新创建我在学校玩的游戏 对于这个游戏 我需要随机产生这些炸弹 如果击中 这些炸弹会将您的银行帐户减少到零 并将方块的炸弹方块的颜色更改为红色 而安全的则变为绿色 我遇到的问题是 我想将炸弹方块的颜色改为红
  • 验证是否有可用网络连接的最简单方法是什么?

    我是 c net 开发的新手 但我已经为我公司的一小部分资产编写了一个股票跟踪应用程序 我还在 SQL 2000 中设置了它连接的数据库 目前 当网络连接可用时 它可以正常工作 但我想扩展它 以便在没有连接时使用 首先 我需要知道是否有可用
  • 如何在 LWUIT 选项卡上显示表单屏幕?

    我在表单上有列表项 当用户单击选项卡时 我必须在选项卡上显示该表单 之后如何将该表单添加到选项卡form show 或者之前 我需要使用表单屏幕默认显示第一个选项卡 您可以在选项卡中显示表单 形式也是一个组件 Form frmObj new
  • 设置 Text().frame(maxWidth: .infinity) 后如何保持 Text 作为前导对齐

    这可能是一个简单的案例 但我找不到解决方案 这是我的代码 使用 GeometryReader 设置 SwiftUI 视图大小的相对布局 如 Image 问题出现在最后一个VStack上 我希望文本的背景转到VStack的右端 因此 我将其设
  • OG:类型文章与网站,用于非文章的单个网页

    我正在寻求有关 og type 文章与网站对于单个网页的使用的澄清 该网页在技术上不是 文章 但也不代表整个网站 文档似乎矛盾 From https developers facebook com docs opengraphprotoco
  • 使用正则表达式从内容中删除 HTML 注释 [重复]

    这个问题在这里已经有答案了 我正在将页面内容放入变量中 content 我需要使用正则表达式从 content 中删除 HTML 注释 我尝试了以下代码 它无法正常工作 content preg replace content 看起来你错过
  • 清理 React Hooks 中未安装组件的内存泄漏

    我是 React 的新手 所以这可能很容易实现 但即使我做了一些研究 我自己也无法弄清楚 如果这太愚蠢了 请原谅我 Context 我在用着惯性 js https inertiajs com 使用 Laravel 后端 和 React 前端
  • mysql 命令超时错误

    我正在使用 asp net mvc 将数据库从 SQL Server 2005 转换为 MySQL 我在 SQL Server 中有大量数据 400k 记录 但我面临命令超时 等待CommandTimeout错误 当我在 Google 上搜
  • 如何让JNLP下载正确版本的JavaFX 2?

    JavaFX 2 高度依赖本机代码 对于我的桌面应用程序 我想为每个受支持的操作系统选择最匹配的 JavaFX 风格 以使目标系统上的安装尽可能轻松 由于 JavaFX 2 附带了几个 Ant 任务来帮助部署 我认为这是可行的方法 但我似乎
  • 如何获取点击时的CSS悬停值?

    对此进行后续跟进question https stackoverflow com questions 7265418 how can i unbind the hover opacity effect of a text link when
  • 从地图中删除 google.maps.marker.AdvancedMarkerView

    我有一张地图 它根据搜索填充标记 我正在尝试使用较新的谷歌地图功能AdvancedMarkerView所以我可以用自定义 HTML 填充它 但是 随着我的搜索更新 我想刷新旧标记并在需要时放置新标记 但我一生都无法弄清楚如何做 https
  • 如何使用 Swift 和 MacOS 隐藏顶部栏(带按钮)?

    我试图从窗口中删除标题和顶部按钮 基本上只显示内容 我尝试过各种方法但没有成功 也没有任何明显的原因说明它不起作用 有关我尝试过的选项 请参阅 setVisibility 函数 AppDelegate swift import Cocoa
  • 可以在 JSON 对象中使用尾随逗号吗?

    手动生成 JSON 对象或数组时 在对象或数组的最后一项上留下尾随逗号通常更容易 例如 从字符串数组输出的代码可能如下所示 在类似 C 的伪代码中 s append for i 0 i lt 5 i s appendF d i s appe
  • 在 C++ 中,当用 ctrl-c 中断时,在死亡之前调用带参数(信号号除外)的函数

    我想在程序终止之前用 ctrl c 中断时向文件中写入几行 然而 文件的位置不是硬编码的 所以我需要比正常中断处理更多的东西正如这里所解释的 https stackoverflow com questions 1641182 how can
  • 我可以使用逻辑索引或索引列表对张量进行切片吗?

    我正在尝试使用列上的逻辑索引对 PyTorch 张量进行切片 我想要与索引向量中的 1 值相对应的列 切片和逻辑索引都是可能的 但是它们可以一起吗 如果是这样 怎么办 我的尝试不断抛出无用的错误 类型错误 使用 ByteTensor 类型的
  • 跨域 bean 验证 - 为什么你不工作

    我的应用程序遇到了一点问题 我想检查字段密码和确认密码是否匹配 所以我尝试像这个问题的第一个答案中那样进行操作 使用 Hibernate Validator JSR 303 进行跨领域验证 https stackoverflow com q