2012-05-05 10 views
5

में दायरा मैं इनपुट दायर सत्यापन लागू करना चाहता हूं।जेएसएफ वैलिडेटर

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"  
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <ui:insert name="header">   
      <ui:include src="header.xhtml"/>   
     </ui:insert> 
    </h:head> 
    <h:body> 

     <h1><img src="resources/css/images/icon.png" alt="NVIDIA.com" /> History Center</h1> 
     <!-- layer for black background of the buttons --> 
     <div id="toolbar" style="margin: 0 auto; width:1180px; height:30px; position:relative; background-color:black"> 
      <!-- Include page Navigation --> 
      <ui:insert name="Navigation">   
       <ui:include src="Navigation.xhtml"/>   
      </ui:insert> 

     </div> 

     <div id="logodiv" style="position:relative; top:35px; left:0px;"> 
      <h:graphicImage alt="Demo Insert Form" style="position:relative; top:-20px; left:9px;" value="resources/images/logo_databasez.png" /> 
     </div> 
     <div id="main" style="margin: 0 auto; width:1190px; height:700px; position:absolute; background-color:transparent; top:105px"> 

      <div id="mainpage" style="margin: 0 auto; width:1190px; height:500px; position:absolute; background-color:transparent; top:80px"> 

       <div id="settingsHashMap" style="width:350px; height:400px; position:absolute; background-color:r; top:20px; left:1px"> 
        <h:form> 
         <div id="settingsdiv" style="width:750px; height:400px; position:absolute; background-color:r; top:20px; left:1px"> 

          <h:panelGrid columns="2"> 
           <h:panelGroup>Session ID</h:panelGroup> 
           <h:panelGroup> 
            <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" > 
             <f:validateLength minimum="0" maximum="15"/> 
             <f:validator binding="#{ValidatorController.validateMessage}" > 
              <f:attribute name="type" value="sessionid" /> 
             </f:validator> 
             <f:ajax event="blur" render="sessionidvalidate" />           
            </h:inputText> 
            <h:message id="sessionidMessage" for="sessionid" /> 
           </h:panelGroup> 

           <h:panelGroup>User ID</h:panelGroup> 
           <h:panelGroup> 
            <h:inputText id="userid" value="#{DatabaseController.formMap['userid']}" > 
             <f:validateLength minimum="0" maximum="15"/> 
            </h:inputText> 
           </h:panelGroup> 

           <h:panelGroup>Login Time</h:panelGroup> 
           <h:panelGroup> 
            <h:inputText id="logintime" value="#{DatabaseController.formMap['logintime']}" > 
             <f:validateLength minimum="0" maximum="35"/> 
            </h:inputText> 
           </h:panelGroup> 

           <h:panelGroup>Last Refresh Time</h:panelGroup> 
           <h:panelGroup> 
            <h:inputText id="lastrefreshtime" value="#{DatabaseController.formMap['lastrefreshtime']}" > 
             <f:validateLength minimum="0" maximum="35"/> 
            </h:inputText> 
           </h:panelGroup> 

           <h:panelGroup>User IP</h:panelGroup> 
           <h:panelGroup> 
            <h:inputText id="userip" value="#{DatabaseController.formMap['userip']}" > 
             <f:validateLength minimum="0" maximum="15"/> 
            </h:inputText> 
           </h:panelGroup> 

          </h:panelGrid>   

         </div> 

         <div id="settingstwodiv" style="width:150px; height:60px; position:absolute; background-color:transparent; top:380px; left:800px"> 

          <h:commandButton value="Create User" action="#{DatabaseController.saveData}"/> 

         </div> 
        </h:form> 

       </div> 

      </div> 
     </div> 

    </h:body> 
</html> 

इस कोड है कि मैं चेहरे-config.xml में जोड़ा

<validator> 
    <validator-id>ValidatorController</validator-id> 
    <validator-class>com.DX_57.HM_57.FormValidator</validator-class> 
</validator> 

यह सत्यापनकर्ता कि मैं परीक्षण करने की कोशिश की के कोड है:: यह कामयाब सेम के कोड है

[#|2012-05-05T22:39:00.096+0300|INFO|glassfish3.1.2|org.glassfish.osgiweb|_ThreadID=58;_ThreadName=Thread-2;|Removed bundle 710 against context path /test |#] 

[#|2012-05-05T22:39:00.097+0300|WARNING|glassfish3.1.2|org.glassfish.osgijavaeebase|_ThreadID=58;_ThreadName=Thread-2;|Failed to deploy bundle com.DX_57.History-Module-57 [710] 
org.glassfish.osgijavaeebase.DeploymentException: Deployment of com.DX_57.History-Module-57 [710] failed because of following reason: Failed while deploying bundle com.DX_57.History-Module-57 [710] : java.lang.RuntimeException: Failed to deploy bundle [ com.DX_57.History-Module-57 [710] ], root cause: Exception while loading the app 
    at org.glassfish.osgijavaeebase.AbstractOSGiDeployer.deploy(AbstractOSGiDeployer.java:125) 
    at org.glassfish.osgijavaeebase.OSGiContainer.deploy(OSGiContainer.java:154) 
    at org.glassfish.osgijavaeebase.JavaEEExtender.deploy(JavaEEExtender.java:107) 
    at org.glassfish.osgijavaeebase.JavaEEExtender.access$200(JavaEEExtender.java:61) 
    at org.glassfish.osgijavaeebase.JavaEEExtender$HybridBundleTrackerCustomizer$1.call(JavaEEExtender.java:151) 
    at org.glassfish.osgijavaeebase.JavaEEExtender$HybridBundleTrackerCustomizer$1.call(JavaEEExtender.java:148) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.RuntimeException: Failed to deploy bundle [ com.DX_57.History-Module-57 [710] ], root cause: Exception while loading the app 
    at org.glassfish.osgijavaeebase.OSGiDeploymentRequest.deploy(OSGiDeploymentRequest.java:196) 
    at org.glassfish.osgijavaeebase.OSGiDeploymentRequest.execute(OSGiDeploymentRequest.java:118) 
    at org.glassfish.osgijavaeebase.AbstractOSGiDeployer.deploy(AbstractOSGiDeployer.java:121) 
    ... 10 more 
Caused by: org.glassfish.deployment.common.DeploymentException: WELD-000072 Managed bean declaring a passivating scope must be passivation capable. Bean: Managed Bean [class com.DX_57.HM_57.FormValidator] with qualifiers [@Any @Default @Named] 
    at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:181) 
    at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128) 
    at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:277) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
    at org.glassfish.osgijavaeebase.OSGiDeploymentRequest.deploy(OSGiDeploymentRequest.java:183) 
    ... 12 more 
Caused by: org.jboss.weld.exceptions.DefinitionException: WELD-000072 Managed bean declaring a passivating scope must be passivation capable. Bean: Managed Bean [class com.DX_57.HM_57.FormValidator] with qualifiers [@Any @Default @Named] 
    at org.jboss.weld.bean.ManagedBean.checkType(ManagedBean.java:405) 
    at org.jboss.weld.bean.AbstractBean.initializeAfterBeanDiscovery(AbstractBean.java:149) 
    at org.jboss.weld.bean.AbstractClassBean.initializeAfterBeanDiscovery(AbstractClassBean.java:308) 
    at org.jboss.weld.bean.ManagedBean.initializeAfterBeanDiscovery(ManagedBean.java:361) 
    at org.jboss.weld.bootstrap.BeanDeployment.doAfterBeanDiscovery(BeanDeployment.java:216) 
    at org.jboss.weld.bootstrap.BeanDeployment.afterBeanDiscovery(BeanDeployment.java:208) 
    at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:352) 
    at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:179) 
    ... 17 more 
|#] 
: जब मैं उदाहरण चलाने का प्रयास
import javax.enterprise.context.SessionScoped; 
import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.validator.Validator; 
import javax.faces.validator.ValidatorException; 
import javax.inject.Named; 

@Named("ValidatorController") 
@SessionScoped 
public class FormValidator implements Validator { 

    public FormValidator() { 
    } 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public void validateMessage(FacesContext context, UIComponent component, Object value) throws ValidatorException { 

     if (value.equals("test")) { 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
        "Session ID is already in use, please choose another.", null)); 
     } 
    } 
} 
समस्या

इस त्रुटि है कि मैं मिलता है

ऐसा लगता है कि वैलिडेटर कक्षा सही दायरे में नहीं है। मुझे किस दायरे का उपयोग करना है?

शुभकामनाएं

+3

मैट ने आपके वर्तमान पीआर का उत्तर दिया है प्रतीक, लेकिन आपके पास वैधकर्ता में अन्य प्रमुख गलतियां भी हैं। अपने पिछले प्रश्न पर मेरे उत्तर में बिल्कुल उदाहरण के मिलान के लिए अपने सत्यापनकर्ता को ठीक करें। आपको 'वैलिडेटर' इंटरफेस की 'मान्य()' विधि में नौकरी करनी चाहिए, कस्टम विधि नहीं। आपको 'चेहरे-config.xml' में पुरानी जेएसएफ 1.x '' घोषणा की आवश्यकता नहीं है। आपको कंक्रीट सत्यापनकर्ता उदाहरण को 'बाध्यकारी' में संदर्भित करना चाहिए, न केवल इसकी विधि। – BalusC

+0

ठीक है, लेकिन अगर मैं चेहरे-config.xml में घोषणा हटा देता हूं तो क्या मैं वैधकर्ता में सीडीआई का उपयोग कर सकता हूं? मैं कस्टम सत्यापनकर्ता को कार्यान्वित करना चाहता हूं क्योंकि यदि मेरे पास 20 इनपुट फ़ील्ड हैं तो मुझे विभिन्न जावा कक्षाओं और फ़ाइलों में 20 मानक सत्यापनकर्ताओं को लागू करना होगा। मैं इसे एक फाइल में करना चाहता हूं। –

+0

क्या यह संभव है? –

उत्तर

1

टेस्ट इस कोड:

<h:panelGroup>Session ID</h:panelGroup> 
<h:panelGroup> 
    <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" 
        validator="#{ValidatorController.validatebean}">           
     <f:ajax event="blur" render="sessionidMessage" />           
    </h:inputText> 
    <h:message id="sessionidMessage" for="sessionid" /> 
</h:panelGroup> 

यह सेम है:

@Named("ValidatorController") 
@ViewScoped 
public class FormValidator implements Validator { 

    public FormValidator() { 
    } 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     if (value.equals("test")) { 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
        " Session ID is already in use, please choose another.", null)); 
     } 
    } 

    public void validatebean(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     if (value.equals("test")) { 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
        " Session ID is already in use, please choose another.", null)); 
     } 
    } 

} 
+0

वाह, मुझे नहीं पता कि यह कोड क्यों और कैसे काम करता है! आप सबको धन्यवाद! –

10

वेल्ड प्रलेखन से:

गुंजाइश के साथ

प्रबंधित सेम @SessionScoped या @ConversationScoped serializable होना चाहिए, के बाद से कंटेनर-समय पर समय से HTTP सत्र passivates।

वहाँ अन्य कारणों से हो सकता है, लेकिन अपने CDI सत्र scoped सेम कम से कम Serializable इंटरफ़ेस को लागू करना चाहिए:

@Named("ValidatorController") 
@SessionScoped 
public class FormValidator implements Validator, Serializable { 
... 
}