Search code examples
validationjsfjsf-2

FacesValidator is not working


Hi there I got a problem with validation of html components via a seperate Validator instance.

The validation is never called! The SYSO is never written out to console!

I already tried to redeploy, update project, clean and restart, reinstall glassfish tools, reinstall glassfish, reinstall eclipse.

This is my project setup:

Project Tree

registration.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://xmlns.jcp.org/jsf/passthrough"
    xmlns:jsf="http://xmlns.jcp.org/jsf">
<h:head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Registration</title>
    <h:outputStylesheet library="css" name="stylesheet.css" target="head" />
    <h:outputScript library="js" name="jquery-3.1.1.min.js" target="head" />
    <h:outputScript library="js" name="jquery-ui-1.12.1.min.js"
        target="head" />
</h:head>
<h:body>
        <h:form prependId="false">              
        <h:inputSecret id="password" binding="#{localPasswordComponent}"  p:placeholder="Password"
                value="#{registrationBean.password}" required="true"
                requiredMessage="Please enter password"
                validatorMessage="Please enter at least 8 characters">
                <f:validateLength minimum="8" />
            </h:inputSecret>
            <h:message for="password" style="color:red" tooltip="true" showSummary="true" showDetail="true"/>
            <br />

            <h:inputSecret id="confirmPassword" p:placeholder="Confirm Password"
                required="#{not empty localPasswordComponent.value}"
                requiredMessage="Please confirm password"
                validatorMessage="Passwords are not equal">
                <f:validator validatorId="equalsValidator" />
                <f:attribute name="equalsValue" value="#{localPasswordComponent.value}" />
            </h:inputSecret>
            <h:message for="confirmPassword" tooltip="true" showSummary="true" showDetail="true"/>
            <br />
            <input jsf:id="submit" name="submit" value="Register" type="submit">
                <f:ajax render="@all" listener="#{registrationBean.register}" />
            </input>
        <br />
        </h:form>
    </h:body>
</html>

EqualsValidator.java:

package de.somepackage.validator;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator(value="equalsValidator")
public class EqualsValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        System.out.println("Wow this is called!!!!!!!!!!!!!");
        Object otherValue = component.getAttributes().get("equalsValue");

        if (value == null || otherValue == null) {
            return; // Let required="true" handle.
        }

        if (!value.equals(otherValue)) {
            FacesMessage msg =
                    new FacesMessage("Values are not equal.");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
        }
    }

}

faces-config.xml:

<?xml version='1.0' encoding='UTF-8'?>

<faces-config version="2.1"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">

</faces-config>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="PeeDeeWebFrontend" version="3.1">
    <display-name>PeeDee</display-name>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>${webapp.projectStage}</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
        <param-value>${webapp.partialStateSaving}</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>${webapp.stateSavingMethod}</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
        <param-value>true</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/web/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>web/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

glassfish-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
    <context-root>/PeeDeeWebFrontend</context-root>
    <class-loader delegate="true"/>
      <jsp-config>
        <property name="keepgenerated" value="true"></property>
      </jsp-config> 
</glassfish-web-app>

Version:

  • GlassFish Server Open Source Edition 4.1.1 (build 1)
  • Eclipse Jee Neon.1 Release (4.6.1) Build id: 20160913-0900
  • JSF 2.2.14 Release of 15. Nov 2016 (was originally 2.1)
  • JAVA_VERSION="1.8.0_102" OS_NAME="Windows" OS_VERSION="5.2" OS_ARCH="amd64"
  • Maven 3 (I think)
  • Java EE 7u2 from http://www.oracle.com/technetwork/java/javaee/downloads/index.html

I used the Java EE 7u2 installation to configure my project.

As I am completely new to this JSF, Glassfish, JSP and other web development stuff I do not have any clue, why this is not working as several examples has suggested it like this. Can someone please provide me an answer or any idea why this is not working?

NOTE: I am running the Server in Eclipse with the Glassfish Tools


Solution

  • AS I found the answer on myself the following code is happening to not throw a runtime error, just a compiler warning:

    <input jsf:id="submit" name="submit" value="Register" type="submit">
        <f:ajax render="@all" listener="#{registrationBean.register}" />
    </input>
    

    Changing it to:

    <h:commandButton value="Submit" action="#{registrationBean.register()}" />
    

    This has resolved my issue and the EqualsValidator is found and called!