跨域 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 验证 - 为什么你不工作 的相关文章

  • Eclipse Faces 配置编辑器不工作

    Summary 编辑 faces config xml 时 Eclipse 中的 Faces 配置编辑器不会打开 这是一个 JavaServer Faces 项目 Details 日食3 7 2 Eclipse m2e 1 0 1 m2e
  • 更新(合并)时缺少 Spring Data JPA 验证

    我正在使用 Spring Boot 1 5 4 RELEASE 和 Spring Data JPA 进行项目 遇到更新实体时未执行 Hibernate 验证器或至少在某些情况下未验证的问题 For Person如下所示 禁止使用空名称 并且
  • Java hibernate 找不到布尔值验证器

    我有一个服务方法尝试添加一个对象store 冬眠的方法 get 方法适用于此 DAO 和服务类 而添加方法则不起作用 在控制台中没有错误 UrlWhiteListDaoImpl urlDao MapperFacade mapper Auto
  • 两个 primefaces 日历组件验证

    我有一个表格JSF 2我使用双字段来指定日期范围 这样做的目的是不让用户选择第二个日期之前的第一个日期 所以我想在发送表单之前执行验证 使用p calendar成分 我所做的是将验证器绑定到第二个日历输入 以便在内部访问第一个组件并比较日期
  • Android 表单验证 UI 库

    有iOSUS2表单验证器 https github com ustwo US2FormValidator用于用户输入验证的库 见下图 我认为该库比默认情况下在某些内容未验证时弹出警报更好 我正在寻找如何在 Android 上做这样的事情 有
  • 有没有办法使用无服务器框架来验证路径

    我在后端使用无服务器框架 使用AWS 我的 serverless yml 像这样 functions getBrand handler functions brand getBrand handler events http path se
  • JSF 2.0 隐式导航,不同的观点

    我正在寻找对 JSF 2 0 隐式导航及其如何与视图一起工作的良好解释 更准确地说 我知道从操作方法中我可以返回一个字符串 它是操作的结果 如果存在文件名与结果匹配的 JSF 视图 那么这就是隐式导航 现在 我的问题是 如果从文件夹内的视图
  • Magento,翻译验证错误消息

    我已经成功创建了原型验证的新规则 现在我需要翻译错误消息 位置 Javascript 中的字符串 但是 我只能翻译所有消息 我的新自定义消息似乎无法翻译 我该如何改变这个 也许你需要一个jstranslator xml里面的文件etc fo
  • jQuery 验证插件:验证自定义日期格式

    我正在使用 jQuery Validate 插件来验证我的表单 如何使用此日期格式 DD MMM YYY 2012 年 3 月 23 日 验证自定义日期 创建自定义验证器 http docs jquery com Plugins Valid
  • @NotNull 注释未检查 Jersey REST 资源中的空查询参数

    我正在尝试使用 javax validation validation api 进行验证 QueryParam参数 我已按照以下步骤操作 添加依赖项
  • 如何将 Font Awesome 4.3.0 与 JSF 集成?

    我已经尝试过这个方法 如何将 webjars org 中的 Font Awesome 与 JSF 结合使用 https stackoverflow com questions 18891768 how to use font awesome
  • 使用自定义验证器进行 ASP.Net 字数统计

    我正在处理的 ASP Net 2 0 项目的要求将某个字段限制为最多 10 个单词 不是字符 我当前正在使用带有以下 ServerValidate 方法的 CustomValidator 控件 Protected Sub TenWordsT
  • 在 Cocoa 应用程序中验证用户输入的 URL 的最佳方法是什么?

    我正在尝试构建一个自制的网络浏览器 以更加熟练地使用 Cocoa 我需要一种好方法来验证用户是否输入了有效的 URL 我尝试过一些正则表达式 但 NSString 有一些有趣的怪癖 并且不喜欢我见过的大多数正则表达式使用的一些反引号 你可以
  • JS jQuery - 检查值是否在数组中

    我更喜欢 PHP 而不是 JS 我认为我的问题更多是语法问题 我有一个小的 jQuery 来 验证 并检查输入值 它适用于单个单词 但我需要数组 我正在使用inArray jQuery 的 var ar value1 value2 valu
  • 如何从另一个 JSF 页面按下某个按钮返回到同一个 JSF 页面

    我有两个 JSF 页面 假设 A 和 B 从这两个页面 A 和 B 我可以导航到页面 C 现在页面 C 中有一个按钮 确定按钮 单击它应该导航回 A 或 B 具体取决于从哪里 A 或 B 调用页面 C 任何帮助将不胜感激 利用视图参数的解决
  • Django 表单验证消息未显示

    我试图限制可以以表单上传的文件类型 大小和扩展名 该功能似乎有效 但未显示验证错误消息 我意识到if file size gt 4 1024 1024可能不是最好的方法 但我稍后会处理这个问题 这是 forms py class Produ
  • PHP 中的 Javascript“unes​​cape”

    我的图像主机有一个 Google Chrome 扩展程序 它会向我的网站发送一个 URL 该网址得到encoded通过 JavaScript 的escape method 编码的 URLescape看起来像这样 http 253A 4 bp
  • 如何将 wsdl 内部架构设置为 Jaxb2Marshaller 以验证我所做的每篇文章?

    我正在使用 SOAP Web 服务 在调用它之前我必须验证每个 xml 帖子 所以我正在使用 The CXF codegen 插件生成POJO树结构 第三部分 wsdl xxxx soap service wsdl 一个类实现Web服务网关
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • AJAX Rails 验证

    我的表单和验证可以很好地处理常规的 http 请求 我希望它使用 AJAX 我知道我可以在客户端进行验证 但这似乎是多余的 因为我已经在模型中定义了验证 当用户填写表单时 我想就他们的条目向他们提供反馈 在 AJAX 表单中使用 Rails

随机推荐

  • 将 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