Struts2 visitor validation not work for JPA entity on EJB Module

76 views Asked by At

I am using the JPA entities as models for my web layer. I am including the EJB module as a dependency for my web project on pom.xml.

I have implemented an action called CreateUserAction which implements ModelDriven:

package actions.accounts;

import com.google.inject.Inject;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import facade.UserFacadeLocal;
import java.util.logging.Level;
import java.util.logging.Logger;
import models.User;

/**
 *
 * @author sergio
 */
public class CreateUserAction extends ActionSupport implements ModelDriven<User>{

    @Inject
    private UserFacadeLocal userFacade;
    private User user = new User();

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }


    public String execute() throws Exception {
        Logger.getLogger(SignupAction.class.getName()).log(Level.INFO, "Registrando usuario");
        userFacade.create(user);
        addActionMessage("Usuario registrado con éxito");
        return SUCCESS;
    }

    @Override
    public User getModel() {
        return user;
    }
}

user is an instance of the class models.User from EJB module:

package models;

import java.io.Serializable;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Temporal;

@Entity(name = "USERS")
@NamedQueries({
    @NamedQuery(name = "User.all", query = "SELECT u FROM USERS u"),
    @NamedQuery(name = "User.find", query = "SELECT u FROM USERS u WHERE u.userName = :username")
})
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "USER_NAME")
    private String userName;
    @Column(name = "PASSWD", length = 32,columnDefinition = "VARCHAR(32)")
    private String password;
    private String name;
    private String lastname;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date birthday;
    private String email;
    private Integer mobile;
    @ManyToMany(cascade={CascadeType.ALL})
    @JoinTable(
            name="USER_GROUPS",
            joinColumns={ @JoinColumn(name="USER_NAME") },
            inverseJoinColumns={ @JoinColumn(name="GROUP_NAME") }
    )
    private Set<Group> groups;


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = hashPassword(password);
    }

    public Set<Group> getGroups() {
        return groups;
    }

    public void setGroups(Set<Group> groups) {
        this.groups = groups;
    }

    public String getName() {
        return name;
    }

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

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getMobile() {
        return mobile;
    }

    public void setMobile(Integer mobile) {
        this.mobile = mobile;
    }

    public String getFullname(){
        return name + " " + lastname; 
    }


    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final User other = (User) obj;
        if ((this.userName == null) ? (other.userName != null) : 
                    !this.userName.equals(other.userName)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 83 * hash + (this.userName != null ? this.userName.hashCode() : 0);
        return hash;
    }


    private String hashPassword(String password) {
        String encoded = null;
        try {
            ByteBuffer passwdBuffer = 
              Charset.defaultCharset().encode(CharBuffer.wrap(password));
            byte[] passwdBytes = passwdBuffer.array();
            MessageDigest mdEnc = MessageDigest.getInstance("MD5");
            mdEnc.update(passwdBytes, 0, password.length());
            encoded = new BigInteger(1, mdEnc.digest()).toString(16);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(User.class.getName()).log(Level.SEVERE, null, ex);
        }

        return encoded;
    }
}

I want to use struts2 validation by the following configuration:

CreateUserAction-validation.xml into src/main/resources/actions/accounts

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <validator type="visitor">
        <param name="fieldName">user</param>
        <param name="appendPrefix">false</param>
        <message />
    </validator>
</validators>

User-validation.xml into src/main/resources/models

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="userName">
      <field-validator type="required">
          <message>You must enter a value for name.</message>
      </field-validator>
    </field>
    <field name="name">
      <field-validator type="required">
          <message>You must enter a value for name.</message>
      </field-validator>
    </field>
</validators>

the User file is well placed?

and to finalize the action settings:

<action name="signup" class="actions.accounts.SignupAction">
            <interceptor-ref name="store">
                <param name="operationMode">RETRIEVE</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack" />
            <result>/WEB-INF/views/accounts/signup.jsp</result>
        </action>
        <action name="create" class="actions.accounts.CreateUserAction">
            <interceptor-ref name="store">
                <param name="operationMode">STORE</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack" />
            <result name="input" type="redirectAction">signup</result>
            <result type="redirectAction">signup</result>
        </action>

thanks in advance

0

There are 0 answers