my application is based on JSF 2.2 EJB 3 JPA on Glassfish 4 with Postgres 9.2 DB. I created ConnectionPool and Datasource on Glassfish, and I use it in my application through the corresponding JNDI data source name. I have two Facelets pages:
login.xhtml, which calls BackingBean LoginBacking, which calls the userManagement EJB login method, which validates the login using a JPA state unit. In this case, everything works, the user can log in, and if the email is already present, the system will inform the user that he is already registered.
registration.xhtml, which calls BackingBean RegistrationBacking, which calls the register method in the UserManagement EJB, which is stored in the database using the JPA Persistence Unit. Registration does not work! While studying Glassfish magazine, I found the following exception:
Finer: client acquired: 553217772
Finer: TX binding to tx mgr, status=STATUS_ACTIVE
Finer: acquire unit of work: 218748741
Finer: begin unit of work flush
Finer: end unit of work flush
Finest: Execute query ReadAllQuery(referenceClass=MomUser sql="SELECT id, classname, company, email, firstname, insertion_date, lastname, password, status, systemuser FROM momuser WHERE (email = ?)")
Finest: Connection acquired from connection pool [read].
Finest: reconnecting to external connection pool
Fine: SELECT id, classname, company, email, firstname, insertion_date, lastname, password, status, systemuser FROM momuser WHERE (email = ?)
bind => [1 parameter bound]
Finest: Connection released to connection pool [read].
Finer: TX beforeCompletion callback, status=STATUS_ACTIVE
Finer: begin unit of work commit
Finer: TX afterCompletion callback, status=COMMITTED
Finer: end unit of work commit
Finer: release unit of work
Finer: client released
Finer: client acquired: 1869986747
Finer: TX binding to tx mgr, status=STATUS_ACTIVE
Finer: acquire unit of work: 76560055
Finer: TX afterCompletion callback, status=ROLLEDBACK
Finer: release unit of work
Finer: client released
Warning: EJB5184:A system exception occurred during an invocation on EJB MomUserManager, method: public void eu.fabrig.mom.session.MomUserManager.registerUser(eu.fabrig.mom.jpa.entity.MomUser) throws eu.fabrig.mom.exception.UserExistsException
Warning: javax.ejb.EJBException
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
...
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.IllegalArgumentException: Object: MomUser{id=null, classname=MOMUser, status=A, systemuser=null, insertionDate=null, email=a@c.it, password=098f6bcd4621d373cade4e832627b4f6, firstname=test, lastname=test, company=Test S.p.A.} is not a known entity type.
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4222)
...
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
... 54 more
Severe: javax.ejb.EJBException
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
...
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.IllegalArgumentException: Object: MomUser{id=null, classname=MOMUser, status=A, systemuser=null, insertionDate=null, email=a@c.it, password=098f6bcd4621d373cade4e832627b4f6, firstname=test, lastname=test, company=Test S.p.A.} is not a known entity type.
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4222)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:496)
...
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
... 54 more
Info:
Below is my persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="eu.fabrig_MOM.PU" transaction-type="JTA">
<jta-data-source>myDataSource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
</persistence-unit>
</persistence>
My Entity and Bean Managed Class:
@Entity
@Table(name = "momuser")
@Named
@RequestScoped
@XmlRootElement
public class MomUser implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq_gen")
@SequenceGenerator(name = "user_seq_gen", sequenceName = "mom_seq_id")
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Size(min = 1, max = 100)
@Column(name = "classname")
private String classname = "MOMUser";
@Column(name = "status")
private Character status = 'A';
@Size(max = 100)
@Column(name = "systemuser")
private String systemuser;
@Basic(optional = false)
@Column(name = "insertion_date", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date insertionDate;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 255)
@Column(name = "email")
private String email;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 255)
@Column(name = "password")
private String password;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 255)
@Column(name = "firstname")
private String firstname;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 255)
@Column(name = "lastname")
private String lastname;
@Size(max = 100)
@Column(name = "company")
private String company;
...
Below is the EJB method:
@Override
public void registerUser(MomUser user) throws UserExistsException {
try {
user.setPassword(generateMD5Hash(user.getPassword()));
em.persist(user);
} catch (UnsupportedEncodingException | NoSuchAlgorithmException ex) {
Logger.getLogger(MomUserManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
Reverse Bean Method:
public String register(){
try {
MomUser currentMomUser = (MomUser) evaluateEL("#{momUser}", MomUser.class);
MomUser momUser = userManager.getUser(currentMomUser.getEmail());
if (momUser != null) {
getContext().addMessage(null, new FacesMessage(EMAIL_ALREADY_EXISTS));
return null;
}
try {
userManager.registerUser(currentMomUser);
} catch (UserExistsException ex) {
Logger.getLogger(RegistrationBacking.class.getName()).log(Level.SEVERE, null, ex);
getContext().addMessage(null, new FacesMessage(EMAIL_ALREADY_EXISTS));
return null;
}
} catch (Exception ex) {
Logger.getLogger(RegistrationBacking.class.getName()).log(Level.SEVERE, null, ex);
getContext().addMessage(null, new FacesMessage(SYSTEM_ERROR));
return null;
}
return "login";
}
And register Facelet:
<f:facet name="header">
<h:outputText value="#{bundle['application.registerpage.registrationMessage']}"/>
</f:facet>
<h:outputText value="#{bundle['momuser.email']}"/><h:inputText id="email"
value="#{momUser.email}"
required="true"
requiredMessage="#{bundle['momuser.email.validation']}"
validatorMessage="#{bundle['momuser.email.invalid']}">
<f:validateRegex pattern="[\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]"/>
</h:inputText>
<h:message for="email" styleClass="errorMessage"/>
<h:outputText value="#{bundle['momuser.password']}"/>
<h:inputSecret id="password"
value="#{momUser.password}"
required="true"
requiredMessage="#{bundle['momuser.password.validation']}"></h:inputSecret>
<h:message for="password" styleClass="errorMessage"/>
<h:outputText value="#{bundle['momuser.firstname']}"/>
<h:inputText id="firstname"
value="#{momUser.firstname}"
required="true"
requiredMessage="#{bundle['momuser.firstname.validation']}"/>
<h:message for="firstname" styleClass="errorMessage"/>
<h:outputText value="#{bundle['momuser.lastname']}"/>
<h:inputText id="lastname"
value="#{momUser.lastname}"
required="true"
requiredMessage="#{bundle['momuser.lastname.validation']}"/>
<h:message for="lastname" styleClass="errorMessage"/>
<h:outputText value="#{bundle['momuser.company']}"/>
<h:inputText id="company"
value="#{momUser.company}"
required="false"/>
<h:message for="company" styleClass="errorMessage"/>
<f:facet name="footer">
<h:panelGroup style="display:block; text-align:center">
<h:commandButton value="#{bundle['application.registrationpage.proceed']}" action="/registration/registrationconfirm?faces-redirect=true"/>
<h:commandButton value="Register" action="#{registrationBacking.register}"/>
<h:link value="#{bundle['application.registrationpage.gotologin']}" outcome="/login"/>
<h:messages globalOnly="true" styleClass="errorMessage"/>
</h:panelGroup>
</f:facet>
</h:panelGrid>
</h:form>
Do you have any ideas? Why can I log in, but I can not register a new user?
thank