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/3/apache-spark/6.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
Validation primefaces的bean验证(JSR303)不起作用_Validation_Jsf_Primefaces_Bean Validation - Fatal编程技术网

Validation primefaces的bean验证(JSR303)不起作用

Validation primefaces的bean验证(JSR303)不起作用,validation,jsf,primefaces,bean-validation,Validation,Jsf,Primefaces,Bean Validation,我正在使用: Primefaces 6.1 JSF:2.2.10 验证:1.1.0.Final 验证器impl:hibernate validator 5.0.1.Final GAE:1.9.52 以下是使用后端bean进行CSV(客户端验证)的示例: 预期结果应该是: 我现在得到的是: bean验证不起作用 我在web.xml中配置了以下内容 <context-param> <param-name>primefaces.CLIENT_SIDE_VAL

我正在使用:

  • Primefaces 6.1
  • JSF:2.2.10
  • 验证:1.1.0.Final
  • 验证器impl:hibernate validator 5.0.1.Final
  • GAE:1.9.52
以下是使用后端bean进行CSV(客户端验证)的示例:

预期结果应该是:

我现在得到的是:

bean验证不起作用

我在web.xml中配置了以下内容

<context-param> 
    <param-name>primefaces.CLIENT_SIDE_VALIDATION</param-name> 
    <param-value>true</param-value> 
</context-param>

primefaces.CLIENT_SIDE_验证
真的
很少有类似的帖子说需要将jsf降级到2.2.2,我试过了,但仍然不起作用

目前CSV的解决方法是

  • 基于演示使用jsf标记验证

例如:

<p:inputText id="age" value="#{beanValidationView.age}" label="Age">
    <f:validateLongRange for="age" minimum="10" maximum="20" />
</p:inputText>

  • 或者创建我自己的验证器
例如:

顺便说一句,我认为这与GAE无关。因为我使用Tomcat9尝试了一个新的动态Web项目,所以它给出了与下面的屏幕截图相同的结果

是不是有什么东西我没有配置或者jar的不同版本导致了这个问题?

通过放置依赖项(即slf4j-jdk14、slf4j api和jboss el),Hibernate验证器可以在Tomcat 9上工作,但不能在GAE上工作。将日志级别配置为更精细后,记录器显示以下条目:

May 04, 2017 9:10:08 AM com.sun.faces.config.processor.ApplicationConfigProcessor addSystemEventListener
FINE: Subscribing for event javax.faces.event.PostConstructApplicationEvent and source javax.faces.application.Application using listener org.primefaces.extensions.application.PostConstructApplicationEventListener
May 04, 2017 9:10:08 AM com.sun.faces.config.processor.ApplicationConfigProcessor isBeanValidatorAvailable
FINE: java.lang.NoClassDefFoundError: javax.naming.InitialContext is a restricted class. Please see the Google  App Engine developer's guide for more details.
java.lang.NoClassDefFoundError: javax.naming.InitialContext is a restricted class. Please see the Google  App Engine developer's guide for more details.
    at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:50)
    at com.sun.faces.config.processor.ApplicationConfigProcessor.isBeanValidatorAvailable(ApplicationConfigProcessor.java:434)
    at com.sun.faces.config.processor.ApplicationConfigProcessor.registerDefaultValidatorIds(ApplicationConfigProcessor.java:396)
    at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:353)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:137)
这是一个“NoClassDefFoundError”,但请登录精细级别而不是警告,并返回更有意义的消息。真糟糕

因此,我对isBeanValidatorAvailable()做了如下小改动,以使其在GAE上工作

static boolean isBeanValidatorAvailable() {

    boolean result = false;
    final String beansValidationAvailabilityCacheKey = 
            "javax.faces.BEANS_VALIDATION_AVAILABLE";
    Map<String,Object> appMap = FacesContext.getCurrentInstance().getExternalContext().getApplicationMap();

    if (appMap.containsKey(beansValidationAvailabilityCacheKey)) {
        result = (Boolean) appMap.get(beansValidationAvailabilityCacheKey);
    } else {
        try {       
            // Code for Google App Engine 
            ValidatorFactory validatorFactory = null;
            try{                
                Object cachedObject=FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get(BeanValidator.VALIDATOR_FACTORY_KEY);
                if (cachedObject instanceof ValidatorFactory) {
                    validatorFactory=(ValidatorFactory)cachedObject;
                } else {
                    validatorFactory=Validation.buildDefaultValidatorFactory();
                }       
            }catch(ValidationException e) {
                LOGGER.log(Level.WARNING, "Could not build a default Bean Validator factory",e);
            }               

            if (null != validatorFactory) {
                appMap.put(BeanValidator.VALIDATOR_FACTORY_KEY, validatorFactory);
                result = true;
            }             
            LOGGER.log(Level.FINE, "result=" +result +", validatorFactory=" +validatorFactory);

         /* incompatible with Google App Engine
          *
            Thread.currentThread().getContextClassLoader().loadClass("javax.validation.MessageInterpolator");
            // Check if the Implementation is available.
            Object cachedObject = appMap.get(BeanValidator.VALIDATOR_FACTORY_KEY);
            if(cachedObject instanceof ValidatorFactory) {
                result = true;
            } else {
                Context initialContext = null;
                try {
                    initialContext = new InitialContext();
                } catch (NoClassDefFoundError nde) {
                    // on google app engine InitialContext is forbidden to use and GAE throws NoClassDefFoundError 
                    if (LOGGER.isLoggable(Level.FINE)) {
                        LOGGER.log(Level.FINE, nde.toString(), nde);
                    }
                } catch (NamingException ne) {
                    if (LOGGER.isLoggable(Level.WARNING)) {
                        LOGGER.log(Level.WARNING, ne.toString(), ne);
                    }
                }

                try {
                    Object validatorFactory = initialContext.lookup("java:comp/ValidatorFactory");
                    if (null != validatorFactory) {
                        appMap.put(BeanValidator.VALIDATOR_FACTORY_KEY, validatorFactory);
                        result = true;
                    }
                } catch (NamingException root) {
                    if (LOGGER.isLoggable(Level.FINE)) {
                        String msg = "Could not build a default Bean Validator factory: " 
                                + root.getMessage();
                        LOGGER.fine(msg);                       
                    }
                }

                if (!result) {
                    try {
                        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
                        Validator validator = factory.getValidator();
                        appMap.put(BeanValidator.VALIDATOR_FACTORY_KEY, factory);
                        result = true;
                    } catch(Throwable throwable) {
                    }
                }
            }
          */
        } catch (Throwable t) { // CNFE or ValidationException or any other
            if (LOGGER.isLoggable(Level.FINE)) {
                LOGGER.fine("Unable to load Beans Validation");
            }
        }
        appMap.put(beansValidationAvailabilityCacheKey, result);
    }
    return result;
}
静态布尔值isBeanValidatorAvailable(){
布尔结果=假;
最终字符串BeanValidationAvailabilityCacheKey=
“javax.faces.BEANS\u验证\u可用”;
Map-appMap=FacesContext.getCurrentInstance().getExternalContext().getApplicationMap();
if(appMap.containsKey(beansValidationAvailabilityCacheKey)){
结果=(布尔)appMap.get(beansValidationAvailabilityCacheKey);
}否则{
试试{
//谷歌应用程序引擎代码
ValidatorFactory=null;
试试{
对象cachedObject=FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get(BeanValidator.VALIDATOR\u FACTORY\u KEY);
if(验证工厂的cachedObject实例){
validatorFactory=(validatorFactory)cachedObject;
}否则{
validatorFactory=Validation.buildDefaultValidatorFactory();
}       
}捕获(ValidationException e){
log(Level.WARNING,“无法构建默认Bean验证程序工厂”,e);
}               
如果(空!=验证工厂){
appMap.put(BeanValidator.VALIDATOR\u FACTORY\u KEY,validatorFactory);
结果=真;
}             
LOGGER.log(Level.FINE,“result=“+result+”,validatorFactory=“+validatorFactory”);
/*与Google应用程序引擎不兼容
*
Thread.currentThread().getContextClassLoader().loadClass(“javax.validation.MessageInterpolator”);
//检查实现是否可用。
Object cachedObject=appMap.get(BeanValidator.VALIDATOR\u FACTORY\u KEY);
if(验证工厂的cachedObject实例){
结果=真;
}否则{
Context initialContext=null;
试一试{
initialContext=新的initialContext();
}捕获(NoClassDefFoundError nde){
//在google应用程序引擎上,InitialContext被禁止使用,GAE抛出NoClassDefFoundError
if(记录器isLoggable(级别精细)){
LOGGER.log(Level.FINE,nde.toString(),nde);
}
}捕获(纳明异常){
if(记录器isLoggable(级别警告)){
LOGGER.log(Level.WARNING,ne.toString(),ne);
}
}
试一试{
objectvalidatorfactory=initialContext.lookup(“java:comp/validatorFactory”);
如果(空!=验证工厂){
appMap.put(BeanValidator.VALIDATOR\u FACTORY\u KEY,validatorFactory);
结果=真;
}
}捕获(NamingException根){
if(记录器isLoggable(级别精细)){
String msg=“无法生成默认的Bean验证程序工厂:”
+root.getMessage();
好的(味精);
}
}
如果(!结果){
试一试{
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=factory.getValidator();
appMap.put(BeanValidator.VALIDATOR\u FACTORY\u KEY,FACTORY);
结果=真;
}捕捉(可抛可抛){
}
}
}
*/
}捕获(可丢弃的t){//CNFE或ValidationException或任何其他
if(记录器isLoggable(级别精细)){
LOGGER.fine(“无法加载bean验证”);
}
}
put(beansValidationAvailabilityCacheKey,结果);
}
返回结果;
}
毕竟,JSR303(Bean验证)问题与JSF2上的GAE限制有关

可以从中获取工作副本。

我也遇到了同样的错误。 我通过从以下位置升级
hibernate验证程序
修复了它:
5.1.3.最终版
致:
5.3.5.最终版

我保留了Primefaces 6.1.

“几乎没有类似的帖子说需要将jsf降级到2.2.2,我试过了,但没有成功。”我无法想象。。。你能帮我定位吗