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

Spring JSF2 JSR 303 bean验证

柯英奕
2023-03-14

我使用Spring 3.2.2与Primeface 4.0和Hibernate 4.2。我在我的实体上有JSR303验证注释,并且我配置了Spring来在服务层验证它们——这很好。

但是我希望在调用服务之前启动JSF验证,但事实并非如此。我所做的所有研究都表明,我只需在类路径中添加一个验证程序,JSF2就会自动应用。

我已将建议的JAR添加到我的类路径中:

[INFO] |     +- com.sun.faces:jsf-api:jar:2.2.4:compile
[INFO] |     +- com.sun.faces:jsf-impl:jar:2.2.4:compile
[INFO] |     +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |     +- org.hibernate:hibernate-validator:jar:4.3.1.Final:compile
[INFO] |     +- org.primefaces.extensions:primefaces-extensions:jar:1.0.0:compile
[INFO] |     |  +- org.primefaces:primefaces:jar:4.0:compile
[INFO] |     +- org.slf4j:slf4j-api:jar:1.7.5:compile
[INFO] |     +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile
[INFO] |     |  \- log4j:log4j:jar:1.2.17:compile
[INFO] |     \- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile

完整的依赖关系树可以在https://gist.github.com/prule/7411171

我的已验证对象和托管bean:

public class ValidatedObject {
    @NotEmpty
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@ManagedBean
@RequestScoped
public class ValidatedController {
    private ValidatedObject object = new ValidatedObject();

    public ValidatedObject getObject() {
        return object;
    }


    public void onSave() {
        System.out.println("saving");
    }
}

Facelets页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">

<f:view contentType="text/html">

    <h:body>
        <h:form >
            <p:messages />
            <p:outputLabel for="name" value="Name"/>
            <p:inputText id="name" value="#{validatedController.object.name}"/>
            <p:commandButton value="Save" action="#{validatedController.onSave}" ajax="false"/>
        </h:form>
    </h:body>

</f:view>
</html>

Spring配置包含:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
    <property name="validator" ref="validator"/>
</bean>

我找到的所有问题和答案都是基本的JSF2(没有Spring)或基于Spring的。我的Spring/jsf集成有什么缺失或不正确的吗?

谢谢。

共有1个答案

常元章
2023-03-14

AFAIK, Spring与JEE7/JSF2.2 Bean验证不兼容。要么等待兼容集,要么使用JEE7兼容的DI框架,如GF4默认附带的JBoss WELD。

 类似资料:
  • 接口说明 验证验证码 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /authcenter/api/verify/v1.0.0/check

  • 我需要应用一个双值验证,这需要与圆周率匹配。我正在考虑使用@pattern(regex=“3.14159265359”)。这是使用Hibernate验证约束应用这样一个约束的最佳方式吗?谢谢

  • 我现在把这两者搞混了。我知道Hibernate Validator6是Bean验证2.0规范的参考实现。它支持分组、错误消息国际化、自定义方法验证等。问题是Spring5支持这些特性还是我只剩下Hibernate Validator6了? 网上所有的参考例子都建议使用Hibernate验证器,没有什么关于Spring验证的发现,请建议或指向其他链接。

  • 我有以下场景:我正在尝试处理一个表单,模型属性是一个具有String和Long属性的bean。众所周知,bean验证提供了很多注释来帮助我们确定数据的有效性。我面临的是,对于Long属性的情况,我只能使用@NotNull和另一个注释(我不记得它的名字)来强制用户输入正数。如果用户输入例如“sdf”,应用程序会抛出一个BIG异常。所以我想知道的是,如果用户在爆炸前输入了一个数字(因为我不能使用@Pa

  • 我刚接触vee validate。我想知道您如何验证按钮是否已按下。我已经用ValidationObserver包装了我的表单,其中有一个v形槽无效。我希望用户被要求选择一个按钮,这将允许用户继续到下一页。 代码验证观察员,我包装我的表单: 下面的代码是我需要知道如何设置用户从列表中选择按钮所需的验证。 和结束我的形式我有按钮,允许用户继续。该按钮将被禁用,直到表单完成并且没有验证错误。但我也想确

  • 我已经使用extend from创建了自定义规则。所以我有这个 当为false且为true时,从上述代码中,它会被上一条规则覆盖,因此结果始终被视为true而不是false 那么我如何才能做到这一点呢? 规则:

  • 我正在测试带注释的javax验证。它们在应用程序中工作良好,方法参数上有注释。但是当我试图通过手动构建验证工厂来测试它们时 我得到以下错误。 javax。验证。ValidationException:HV000183:无法初始化“javax”。艾尔。“表达工厂”。检查类路径上是否有EL依赖项,或者改用ParameterMessageInterpolator 收到这个错误后,我在gradle文件中添

  • 我读过很多关于这方面的帖子,但我无法解决我的问题。当我试图验证zend表单验证码时,即使文本正确,也总是失败。下面是我的代码: 谢谢你的时间和帮助!! 我看到了一些不可靠的东西:当我在联系人操作中转储$_post时,我的结果是: 我刚刚输入的验证码甚至出现了,取而代之的是验证码凯!!?? 我觉得我需要删除这个captchaField,但不知道如何到目前为止! 我可以用JS做到这一点,但必须有一个干