You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.
| Online: | 11 Members of 9199 |
| Forum: Seam Users |
16. Sep 2009, 05:03 America/New_York | Link |
My background: I am new to both Seam and Java though I've been studying them with great enthusiasm and effort for a significant while. My background is in the old ASP vbscript world (MS Access db). Instead of going .Net, I am developing with Java/seam/postgres.
System environment: Java (latest)/Seam (2.1.2.GA)/Postgresql (8.4)/Jboss AS (5.1.0.GA)/Eclipse (3.4.2) with Seam Tools (latest) on a Windows Server 2003 native Japanese machine. Jboss default server deployed with postgres-ds.xml and postgresql-persistence-service.xml rather than hsqldb-ds.xml and hsqldb-persistence-service.xml.
I have been stumped with getting the s:convertEntity working with a h:selectOneMenu control which has had me pouring through tons of blogs, community posts, etc. for about two full weeks now. Ugh!
I found Christian Bauer's post of his new matchingEntityConverter class yesterday and am now trying to use that instead of s:convertEntity.
matchingEntityConvert can be found at the following links:
relation.to/Bloggers/DropdownsInJSFValidatingTheSelectedValue
Documentation/DropdownBoxesWithEntitiesAndPSageScope
Some initial questions before getting into the current error that I am getting:
1. I believe that I learned from one or more postings that s:convertEntity would work with h:selectOneMenu but not multi-select controls. For example, the following link mentions that Unfortunately, Seam's convertEnum can't handle multi selects yet.
in a discussion of s:convertEnum on a h:selectManyCheckbox control. Link.
Question: Is the matchingEntityConverter class expected to work with multi-select controls as well as single select controls?
2. I have seen postings indicating that Seam assumes that the name of the parameter assigned @id in entities is called id
and that naming it id
is important for some classes such as s:convertEntity. Is this really true? I had named given them a different name (though in my entities and tables for testing the s:convertEntity functionality, I am using the name id
to keep it simple). Should I change all of the @id parameters to id
or does it not matter?
3. I assumed that the following are the classes needed by the matchingEntityConvert class. Is this correct? In particular, java.util. instead of org.hibernate.mapping. for Collection and Set. Also org.jboss.seam.ui. instead of org.hibernate.loader.entity. for AbstractEntityLoader.
java.beans.Introspector, java.beans.PropertyDescriptor, java.io.Serializable, java.util.Collection, java.util.HashSet, java.util.Set, javax.faces.component.UIComponent, javax.faces.context.FacesContext, javax.faces.convert.ConverterException, org.jboss.seam.annotations.Install, org.jboss.seam.annotations.Name, org.jboss.seam.annotations.faces.Converter, org.jboss.seam.annotations.intercept.BypassInterceptors, org.jboss.seam.annotations.Scope, org.jboss.seam.annotations.Transactional, org.jboss.seam.ui.AbstractEntityLoader, org.jboss.seam.ScopeType
Below is the error information that I am getting:
Stack Trace:
08:59:19,671 SEVERE [viewhandler] Error Rendering View[/person04tst03.xhtml] java.lang.ClassCastException: org.jboss.seam.ui.JpaEntityLoader_$$_javassist_seam_8 cannot be cast to org.jboss.seam.ui.AbstractEntityLoader at org.jboss.seam.ui.AbstractEntityLoader.instance(AbstractEntityLoader.java:55) at com.mysite.conversation.MatchingEntityConverter.getEntityLoader(MatchingEntityConverter.java:76) at com.mysite.conversation.MatchingEntityConverter.getAsString(MatchingEntityConverter.java:95) at org.jboss.seam.ui.converter.PrioritizableConverter.getAsString(PrioritizableConverter.java:67) at org.jboss.seam.ui.converter.ConverterChain.getAsString(ConverterChain.java:126) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:448) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRenderer.java:480) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:772) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:832) at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:280) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:861) at org.jboss.seam.ui.util.cdk.RendererBase.renderChild(RendererBase.java:190) at org.jboss.seam.ui.util.cdk.RendererBase.renderChildren(RendererBase.java:166) at org.jboss.seam.ui.renderkit.ValidateAllRendererBase.doEncodeChildren(ValidateAllRendererBase.java:33) at org.jboss.seam.ui.util.cdk.RendererBase.encodeChildren(RendererBase.java:92) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837) at org.jboss.seam.ui.util.cdk.RendererBase.renderChild(RendererBase.java:186) at org.jboss.seam.ui.util.cdk.RendererBase.renderChildren(RendererBase.java:166) at org.jboss.seam.ui.renderkit.DecorateRendererBase.doEncodeChildren(DecorateRendererBase.java:152) at org.jboss.seam.ui.util.cdk.RendererBase.encodeChildren(RendererBase.java:92) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) at javax.faces.render.Renderer.encodeChildren(Renderer.java:148) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:933) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592) at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100) at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619)
Also the following Warning:
08:59:19,656 WARN [AjaxRendererUtils] AJAX Status component not found for AjaxComponent with id j_id140 08:59:19,812 WARN [AjaxRendererUtils] AJAX Status component not found for AjaxComponent with id j_id140
I put in the following package:
package com.mysite.conversation;
Components.xml:
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:bpm="http://jboss.com/products/seam/bpm"
xmlns:core="http://jboss.com/products/seam/core"
xmlns:drools="http://jboss.com/products/seam/drools"
xmlns:framework="http://jboss.com/products/seam/framework"
xmlns:mail="http://jboss.com/products/seam/mail"
xmlns:persistence="http://jboss.com/products/seam/persistence"
xmlns:security="http://jboss.com/products/seam/security"
xmlns:transaction="http://jboss.com/products/seam/transaction"
xmlns:web="http://jboss.com/products/seam/web"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd
http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.1.xsd
http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd
http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.1.xsd
http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.1.xsd
http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.1.xsd
http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd
http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.1.xsd
http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.1.xsd
http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd">
<core:init jndi-pattern="@jndiPattern@" debug="true" distributable="false"/>
<core:manager
conversation-timeout="120000"
concurrent-request-timeout="500"
conversation-id-parameter="cid"
/>
<transaction:ejb-transaction/>
<persistence:managed-persistence-context name="entityManager"
persistence-unit-jndi-name="java:/com-mysiteEntityManagerFactory"
/>
<!-- framework:entity-home name="catGenderHome" entity-class="com.mysite.entity.CatGender" / -->
<!-- factory name="catGender" value="#{catGenderHome.instance}" / -->
<component name="identifierMatchingEntityConverter"
class="com.mysite.conversation.MatchingEntityConverter"
>
<property name="match">id</property> <!-- That's actually the default property we'd use for comparison-->
</component>
<security:identity authenticate-method="#{authenticator.authenticate}"/>
</components>
View: person04tst03.xhtml
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:rich="http://richfaces.org/rich"
xmlns:a="http://richfaces.org/a4j"
template="/layout/defaultATemplate.xhtml"
>
... (bunch of html) ...
<ui:define name="content">
<div class="section"><!-- RandomRef_ALSog -->
<h1>person04Create</h1>
</div><!-- class="section" --><!-- RandomRef_ALSog -->
<div class="section"><!-- RandomRef_kjADe -->
<div class="entry errors">
<h:messages id="messages" globalOnly="true"/>
</div><!-- class="entry errors" -->
<h:form id="person04CreationForm">
<fieldset><!-- RandomRef_BSEgk -->
<s:decorate id="usernameDecorate" template="layout/edit.xhtml">
<ui:define name="label">Username:</ui:define>
<h:inputText id="username" value="#{person04.username}" required="true">
<a:support id="onblur" event="onblur" reRender="usernameDecorate"/>
</h:inputText><!-- id="username" -->
</s:decorate><!-- id="usernameDecorate" -->
<s:decorate id="nameDecorate" template="layout/edit.xhtml">
<ui:define name="label">Real Name:</ui:define>
<h:inputText id="name" value="#{person04.name}" required="true">
<a:support id="onblur" event="onblur" reRender="nameDecorate"/>
</h:inputText><!-- id="name" -->
</s:decorate><!-- id="nameDecorate" -->
<s:decorate id="passwordDecorate" template="layout/edit.xhtml">
<ui:define name="label">Password:</ui:define>
<h:inputSecret id="password" value="#{person04.password}" required="true"/>
</s:decorate><!-- id="passwordDecorate" -->
<s:decorate id="verifyDecorate" template="layout/edit.xhtml">
<ui:define name="label">Verify Password:</ui:define>
<h:inputSecret id="verify" value="#{person04Create.verify}" required="true"/>
</s:decorate><!-- id="verifyDecorate" -->
<s:decorate id="firstNameDecorate" template="layout/edit.xhtml">
<ui:define name="label">First Name:</ui:define>
<h:inputText id="firstName" value="#{person04.firstName}" required="true">
<a:support id="onblur" event="onblur" reRender="firstNameDecorate"/>
</h:inputText><!-- id="firstName" -->
</s:decorate><!-- id="firstNameDecorate" -->
<s:decorate id="lastNameDecorate" template="layout/edit.xhtml">
<ui:define name="label">Last Name:</ui:define>
<h:inputText id="lastName" value="#{person04.lastName}" required="true">
<a:support id="onblur" event="onblur" reRender="lastNameDecorate"/>
</h:inputText><!-- id="lastName" -->
</s:decorate><!-- id="lastNameDecorate" -->
<s:decorate id="country01Decorate" template="layout/edit.xhtml">
<ui:define name="label">Country01:</ui:define>
<!-- h:inputText id="country01" value="# {person04.country01.id}" required="true">
<a:support id="onblur" event="onblur" reRender="country01Decorate"/>
</h:inputText --><!-- id="country01" -->
<h:selectOneMenu value="#{person04.country01}" required="true"
converter="#{identifierMatchingEntityConverter}">
<s:selectItems value="#{country01s}"
var="country01Var"
label="#{country01Var.name}"
noSelectionLabel="Please Select..."/>
<a:support event="onchange" reRender="country01Decorate" status="globalStatus"/>
<!-- s:convertEntity / -->
</h:selectOneMenu>
</s:decorate><!-- id="country01Decorate" -->
<div class="buttonBox">
<h:commandButton id="person04Create" value="Person04Create" action="#{person04Create.register}"/>
 
<s:button id="cancel" value="Cancel" view="/home.xhtml"/>
</div><!-- class="buttonBox" -->
</fieldset><!-- RandomRef_BSEgk -->
</h:form><!-- id="person04CreationForm" -->
</div><!-- RandomRef_kjADe -->
</ui:define><!-- content -->
</ui:composition>
PLEASE NOTE: IN THE ENTITY CLASSES: TABLE, COLUMN AND JOINCOLUMN NAMES ARE ENCLODED IN BACKTICKS IN ORDER TO SUCCESSFULLY INTERACT WITH POSTGRESQL. HOWEVER, I CHANGED THEM TO FORWARD TICKS IN THIS POST AS THEY WERE CAUSING FORMATTING ERRORS IN THIS SEAMFRAMEWORK.ORG FORUM POSTING FORM
Enitity: Person04.java
package com.mysite.entity;
import static org.jboss.seam.ScopeType.SESSION;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Pattern;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@Entity
@Name("person04")
@Scope(SESSION)
@Table(name="'person04'")
public class Person04 implements Serializable
{
private String username;
private String password;
private String name;
private Long id;
private String firstName;
private String lastName;
private Country01 country01;
public Person04(String name, String password, String username)
{
this.name = name;
this.password = password;
this.username = username;
}
public Person04() {}
@NotNull
@Length(max=100)
@Column(name="'name'")
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@NotNull
@Length(min=5, max=15)
@Column(name="'password'")
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
@Length(min=4, max=15)
@Pattern(regex="^\\w*$", message="not a valid username")
@Column(name="'username'")
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
@Id
@NotNull
@SequenceGenerator(name="person04_id_seqIdentifier", sequenceName="person04_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="person04_id_seqIdentifier")
@Column(name="'id'", unique=true, columnDefinition="bigserial")
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
@NotNull
@Column(name="'firstName'")
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
@NotNull
@Column(name="'lastName'")
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
@ManyToOne
@JoinColumn(name="'country01Id'")
public Country01 getCountry01()
{
return country01;
}
public void setCountry01(Country01 country01)
{
this.country01 = country01;
}
@Override
public String toString()
{
return "Person04(" +
username +
")";
}
}
Entity: Country01.java
package com.mysite.entity;
import static org.jboss.seam.ScopeType.SESSION;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@Entity
@Name("country01")
@Scope(SESSION)
@Table(name="'country01'")
public class Country01 implements Serializable
{
private Long id;
private String name;
public Country01(String name)
{
this.name = name;
}
public Country01() {}
@Id
@NotNull
@SequenceGenerator(name="country01_id_seqIdentifier", sequenceName="country01_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="country01_id_seqIdentifier")
@Column(name="'id'", unique=true, columnDefinition="bigserial")
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
@NotNull
@Length(max=100)
@Column(name="'name'")
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
/*
return "Country01(" +
id + "," +
firstName + "," +
lastName +
")";
*/
return "Country01(" +
name +
")";
}
}
Country01List.java
package com.mysite.session;
import javax.ejb.Local;
import com.mysite.entity.Country01;
@Local
public interface Country01List
{
public void getCountry01s();
public Country01 getCountry01();
public void destroy();
}
Country01ListAction.java
package com.mysite.session;
import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
import static org.jboss.seam.ScopeType.SESSION;
import java.io.Serializable;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
import com.mysite.entity.Country01;
@Stateful
@Scope(SESSION)
@Name("country01List")
@TransactionAttribute(REQUIRES_NEW)
public class Country01ListAction implements Country01List, Serializable
{
private static final long serialVersionUID = 1L;
@PersistenceContext
private EntityManager em;
@DataModel
private List<Country01> country01s;
@DataModelSelection
private Country01 country01;
@Logger
private Log log;
@Factory
@Observer("country01Confirmed")
public void getCountry01s()
{
country01s = em.createQuery("select c from Country01 c")
.getResultList();
}
public Country01 getCountry01()
{
return country01;
}
@Destroy
@Remove
public void destroy() {}
}
Any help you could provide on this would be so much appreciated.
Jeff
1. I don't remember that limitation and I have successfully tested my converter with h:selectManyCheckbox.
2. You can name the @Id property whatever you want, convention is however id as that is also the implied and reserved named in older versions of the Hibernate Query Language. It makes things easier.
3. I've added the imports to the example here. But you are getting a ClassCastException, so obviously something with your deployment/configuration is wrong. It might have something to do with wrong imports but I doubt it.
Check out my weblog or have a look at the books I wrote.
Christian,
Thank you for your input and review.
I will change the names of my ids to id to keep with standards.
I just confirmed that I am using the same imports for the matchingEntityConverter class that you updated on the Documentation/DropdownBoxesWithEntitiesAndPageScope page.
I will re-check the deployment/configurations and will post again. I wonder if my using Postgresql for jboss itself and the app would have anything to do with the issues. I was guessing not but I don't know. I used the booking example as my starting point and have been adding to and modifying that.
Thanks again, Jeff
I forgot to mention, Eclipse is indicating the following warnings in the matchingEntityConverter class:
The serializable class MatchingEntityConverter does not declare a static final serialVersionUID field of type long
public class MatchingEntityConverter implements javax.faces.convert.Converter, Serializable {AbstractEntityLoader is a raw type. References to generic type AbstractEntityLoader<T> should be parameterized
Set is a raw type. References to generic type Set<E> should be parameterized
HashSet is a raw type. References to generic type HashSet<E> should be parameterized
Collection is a raw type. References to generic type Collection<E> should be parameterized
for (Object selectItemsValue : (Collection) selectItems.getValue()) {Type safety: The method add(Object) belongs to the raw type Set. References to generic type Set<E> should be parameterized
All of the above warnings can be safely ignored. They should however be fixed if this code is going to be going out to the community. It would be nicer then :P
I can't quite understand why you are getting the class cast exception.
If we look at the JpaEntityLoader class
Looks pretty obvious that casting JpaEntityLoader to AbstractEntityLoader should work fine.
Can you check you havn't accidently got two different versions of the Seam library on your path?
That is a challenging question for me to answer. The following is my first attempt at answering whether there are two different version of the Seam library on the path.
Actually, I am not really sure where the path is defined.
After investigating, it appears to be ok, but I'm not completely sure. Below are the details of investigating:
Microsoft system environmental variables: No seam library path information defined there.
I use the Seam perspective of Eclipse with the Jboss Tools for Seam and initially generated the project via New Seam Web Project. At that time, Seam was version 2.1.1. I then copied in the relevant contents of the booking example files. At one point, I replaced the Seam 2.1.1 library files with the Seam 2.1.2 versions to upgrade from Seam 2.1.1 to Seam 2.1.2.
There are therefore 4 separate project directories in Eclipse: mysite, mysite-ear, mysite-ejb, and mysite-test.
The following are the libraries as viewed in the exploded directories of the default jboss server:
ear root directory: (Below each are version info from the MANIFEST.MF in the respective jar files)
The following are the contents of the MANIFEST.MF file within the jar META-INF directory:
The following are the contents of the MANIFEST.MF file within the war WEB-INF lib directory:
The following are the libraries in the war WEB-INF lib directory and their versions in each's respective MANIFEST.MF file:
The following are the contents of the .classpath file within the mysite-ejb directory in Eclipse:
Would it be helpful for me to post contents of some of the other configuration files?
The following are the contents of the MANIFEST.MF file within the war WEB-INF lib directory:
I made the following changes:
1. Renamed all @id attributes of entities to be "id" and modified all classes and xhtml files to use "id".
2. Changed the name of the entityManger in all places from em to entityManager
3. Modified components.xml to be the following:
<?xml version="1.0" encoding="UTF-8"?> <components xmlns="http://jboss.com/products/seam/components" xmlns:bpm="http://jboss.com/products/seam/bpm" xmlns:core="http://jboss.com/products/seam/core" xmlns:drools="http://jboss.com/products/seam/drools" xmlns:framework="http://jboss.com/products/seam/framework" xmlns:mail="http://jboss.com/products/seam/mail" xmlns:persistence="http://jboss.com/products/seam/persistence" xmlns:security="http://jboss.com/products/seam/security" xmlns:transaction="http://jboss.com/products/seam/transaction" xmlns:web="http://jboss.com/products/seam/web" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.1.xsd http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.1.xsd http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.1.xsd http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.1.xsd http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.1.xsd http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.1.xsd http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd"> <core:init jndi-pattern="@jndiPattern@" debug="true" distributable="false"/> <core:manager conversation-timeout="120000" concurrent-request-timeout="500" conversation-id-parameter="cid" /> <transaction:ejb-transaction/> <persistence:entity-manager-factory name="mysiteEntityManagerFactory" persistence-unit-name="mysite" installed="@loadPersistenceUnits@"/> <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{mysiteEntityManagerFactory}" persistence-unit-jndi-name="java:/mysiteEntityManagerFactory"/> <component name="identifierMatchingEntityConverter" class="mysite.conversation.MatchingEntityConverter" > <property name="match">id</property> </component> <security:identity authenticate-method="#{authenticator.authenticate}"/> </components>Now I am getting the following errors:
javax.faces.FacesException: javax.el.ELException: /person04tst05.xhtml @94,83 value="#{person04Create.verify}": Error reading 'verify' on type org.javassist.tmp.java.lang.Object_$$_javassist_seam_3 at javax.faces.component.UIOutput.getValue(UIOutput.java:187) Caused by: javax.el.ELException: /person04tst05.xhtml @94,83 value="#{person04Create.verify}": Error reading 'verify' on type org.javassist.tmp.java.lang.Object_$$_javassist_seam_3 at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:76) Caused by: javax.ejb.EJBTransactionRolledbackException: java.lang.Long cannot be cast to javax.persistence.EntityManagerFactory at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115)Stack Trace:
javax.faces.FacesException: javax.el.ELException: /person04tst05.xhtml @94,83 value="#{person04Create.verify}": Error reading 'verify' on type org.javassist.tmp.java.lang.Object_$$_javassist_seam_3 at javax.faces.component.UIOutput.getValue(UIOutput.java:187) at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:201) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:284) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:154) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:861) at org.jboss.seam.ui.util.cdk.RendererBase.renderChild(RendererBase.java:190) at org.jboss.seam.ui.util.cdk.RendererBase.renderChildren(RendererBase.java:166) at org.jboss.seam.ui.renderkit.ValidateAllRendererBase.doEncodeChildren(ValidateAllRendererBase.java:33) at org.jboss.seam.ui.util.cdk.RendererBase.encodeChildren(RendererBase.java:92) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837) at org.jboss.seam.ui.util.cdk.RendererBase.renderChild(RendererBase.java:186) at org.jboss.seam.ui.util.cdk.RendererBase.renderChildren(RendererBase.java:166) at org.jboss.seam.ui.renderkit.DecorateRendererBase.doEncodeChildren(DecorateRendererBase.java:152) at org.jboss.seam.ui.util.cdk.RendererBase.encodeChildren(RendererBase.java:92) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) at javax.faces.render.Renderer.encodeChildren(Renderer.java:148) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:933) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592) at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100) at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) Caused by: javax.el.ELException: /person04tst05.xhtml @94,83 value="#{person04Create.verify}": Error reading 'verify' on type org.javassist.tmp.java.lang.Object_$$_javassist_seam_3 at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:76) at javax.faces.component.UIOutput.getValue(UIOutput.java:184) ... 68 more Caused by: javax.ejb.EJBTransactionRolledbackException: java.lang.Long cannot be cast to javax.persistence.EntityManagerFactory at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115) at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130) at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:194) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorv2.invoke(RoleBasedAuthorizationInterceptorv2.java:201) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:176) at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:216) at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207) at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164) at $Proxy620.getVerify(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32) at org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:76) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) at org.jboss.seam.ejb.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:43) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107) at org.jboss.seam.intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java:54) at org.javassist.tmp.java.lang.Object_$$_javassist_seam_3.getVerify(Object_$$_javassist_seam_3.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:62) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) at org.jboss.el.parser.AstPropertySuffix.getValue(AstPropertySuffix.java:53) at org.jboss.el.parser.AstValue.getValue(AstValue.java:67) at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71) ... 69 more Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to javax.persistence.EntityManagerFactory at org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManagerFactoryFromJndiOrValueBinding(ManagedPersistenceContext.java:234) at org.jboss.seam.persistence.ManagedPersistenceContext.initEntityManager(ManagedPersistenceContext.java:78) at org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManager(ManagedPersistenceContext.java:107) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) at org.jboss.seam.Component.callComponentMethod(Component.java:2249) at org.jboss.seam.Component.unwrap(Component.java:2275) at org.jboss.seam.Component.getInstance(Component.java:2041) at org.jboss.seam.Component.getInstance(Component.java:1983) at org.jboss.seam.Component.getInstance(Component.java:1977) at org.jboss.seam.Component.getInstanceInAllNamespaces(Component.java:2349) at org.jboss.seam.Component.getValueToInject(Component.java:2301) at org.jboss.seam.Component.injectAttributes(Component.java:1736) at org.jboss.seam.Component.inject(Component.java:1554) at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:61) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.persistence.EntityManagerProxyInterceptor.aroundInvoke(EntityManagerProxyInterceptor.java:29) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.persistence.HibernateSessionProxyInterceptor.aroundInvoke(HibernateSessionProxyInterceptor.java:30) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107) at org.jboss.seam.intercept.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:50) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.ejb3.interceptors.aop.EJB3InterceptorInterceptor.invoke(EJB3InterceptorInterceptor.java:83) at org.jboss.ejb3.interceptors.aop.EJB3InterceptorInterceptor.invoke(EJB3InterceptorInterceptor.java:70) at org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:59) at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:73) at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:59) at sun.reflect.GeneratedMethodAccessor470.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:72) at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_21290107.invoke(InvocationContextInterceptor_z_fillMethod_21290107.java) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:88) at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_21290107.invoke(InvocationContextInterceptor_z_setup_21290107.java) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:60) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:56) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:81) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126) ... 114 morepersistence.xml is the following:
<?xml version="1.0" encoding="UTF-8"?> <!-- Persistence deployment descriptor for dev profile --> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="mysite" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/mysiteDatasource</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="jboss.entity.manager.factory.jndi.name" value="java:/mysiteEntityManagerFactory"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/> </properties> </persistence-unit> </persistence>Any ideas as to the cause of the issue?
Thanks
Jeff
Hello Jeff, I'm also trying to implement custom converter and I have exactly the same problem as you - ClassCastException. Are you sure that after having the changes you resolved THIS exception and you are not falling in javax.el.ELException BEFORE the ClassCast should happen? I'm asking you because classcast exception concerns wrong jar files (mixing libraries).
Thank you in advance.
Hello Alexander,
I found some issues with jar files since September which I believe I corrected. However, I have not attempted to implement the custom converter since September and ended up getting the s:convertEntity to work (which was extremely challenging for me to fix the issues at the time).
I do not know as of yet whether the changes of jar files would have corrected the issue with the custom converter. I plan to take another look at it again tomorrow and see if I can post some further insight into it.
Regards,
Jeff
Hello Jeff,
Thank you for the answer. In fact, I wish to get this s:convertEntity working by all means. Of course, I have already tried to use this built-in converter but failed. Please, tell me, did you changed somehow equals() and hashCode()? My methods are not working well :(
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } //http://www.seamframework.org/Documentation/IGetValueIsNotAValidOptionWhenUsingSselectItemsAndSconvertEntityOrACustomConverter // if (getClass() != obj.getClass()) { // return false; // } Projects other = (Projects) obj; if (getId() == null) { if (other.getId() != null) { return false; } } else if (!getId().equals(other.getId())) { return false; } return true; }
I took a glance at https://www.hibernate.org/109.html as well as http://djeang.blogspot.com/2005/08/override-equals-and-hashcode-methods.html
Thanks.
Oh, here is a good formatting:
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } //http://www.seamframework.org/Documentation/IGetValueIsNotAValidOptionWhenUsingSselectItemsAndSconvertEntityOrACustomConverter // if (getClass() != obj.getClass()) { // return false; // } Projects other = (Projects) obj; if (getId() == null) { if (other.getId() != null) { return false; } } else if (!getId().equals(other.getId())) { return false; } return true; }Hello Alexander,
I just recalled changes that enabled the s:convertEntity to work for me. I took a different approach than via modification to hashcode() and equals(Object obj).
My initial solution was by making <framework:entity-query entries in components.xml.
Later, after I cleaned up my libraries issues, I got a solution more preferable to me working which I will describe below. I assume that you have read the following post because you were able to find Christian Bauer's MatchingEntityConverter.
Dropdowns in JSF: Validating the selected value
Near the top of that post, there is a section titled "The Workarounds". In your solution, it appears that you are attempting the workaround #2. The one that I got to work was workaround #1 "1.Display the list and submit the form inside the same long running conversation (so that the persistence context returns the same object both times)."
So, this is what I did. If I recall correctly, the @Scope(CONVERSATION) on the class, the @PersistenceContext(type=PersistenceContextType.EXTENDED) and @In(create=true) on the entityManager and the @Factory on getMyOptionsList() were important. The @TransactionAttribute(REQUIRES_NEW) might also have been important.
package com.mysite; import static org.jboss.seam.ScopeType.CONVERSATION; import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; import java.io.Serializable; import java.util.List; import javax.ejb.Remove; import javax.ejb.Stateful; import javax.ejb.TransactionAttribute; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; @Stateful @Scope(CONVERSATION) @Name("myOptionList") @TransactionAttribute(REQUIRES_NEW) public class MyOptionListAction implements MyOptionList, Serializable { private static final long serialVersionUID = 4292649042195284573L; public MyOptionListAction() {}; @PersistenceContext(type=PersistenceContextType.EXTENDED) @In(create=true) private EntityManager entityManager; private List<MyOption> myOptionsList; @Create public void create() { getMyOptionsList(); } @SuppressWarnings("unchecked") @Factory public List<MyOption> getMyOptionsList() { return (List<MyOption>) entityManager.createQuery( "select r from MyOption r where " + "r.someParameter.id = :someParameterId " + "order by r.order asc") .setParameter("someParameterId", valueIWantToMatchTo) .getResultList(); } public void setMyOptionsList(List<MyOption> myOptionsList) { this.myOptionsList = myOptionsList; } @Destroy @Remove public void destroy() {} }And then in the conversation object where I capture the value of the s:convertEntity and use it, I ensure that I inject the SAME persistence context. This was key.
@Stateful @Name("useOfMyOptionsList") @Scope(ScopeType.CONVERSATION) @TransactionAttribute(REQUIRES_NEW) public class UseOfMyOptionsListAction implements UseOfMyOptionsList { public UseOfMyOptionsListAction() {} @PersistenceContext(type=PersistenceContextType.EXTENDED) @In(create=true) private EntityManager entityManager; @DataModel private List<MyOption> chosenMyOptions = null; The, the rest of the code. }Here is the xhtml code:
<h:selectManyListbox id="theSelectManyCheckboxlistId" value="#{useOfMyOptionsList.chosenMyOptions}" valueChangeListener="#{useOfMyOptionsList.vclForchosenMyOptions}" > <s:selectItems value="#{myOptionsList}" var="chosenMyOptionVar" label="#{chosenMyOptionVar.label}" /> <s:convertEntity />Good news Jeff!
Yesterday I found that @Scope(CONVERSATION) really does the job. I mean that I have already used the converter but it did not help to make the restriction in my EJBQL statement. In fact I use only EntityHome / EntityQuery internal framework to have rapid development. Certainly, I experienced many problems (probably I should use the latest SEAM) but it's worth it.
I see that you use h:selectManyListbox. It is my next step and I've got a problem from converter (Caused by org.jboss.seam.Entity$NotEntityException with message: ).
Are you sure that the @Factory is a must for the public
?
Why you separated the list for options to the UseOfMyOptionsListAction instead of inplace definition of vclForchosenMyOptions? Is it obligatory?
Thank you.
Hi Alexander,
That is great news that the @Scope(CONVERSATION) helped you. So, you were able to get the matchngEntityConverter class working? I still have not tried that again yet due to being swamped with other things but am curious to know how that went for you. I may want to try using that again later on.
In regards to the error you mentioned:
org.jboss.seam.Entity$NotEntityException with message:
"Not an entity class: java.util.ArrayList"
I am not sure about that one. I vaguely recall that I may have removed @DataModel from the definition of private List<MyOption> myOptionsList; in the MyOptionListAction class due to an error with having the @DataModel there.
I am not sure if the @Factory is a must or not. I also vaguely recall issues when I tried commenting it out.
I may not be completely understanding the following question: "separated the list for options to the UseOfMyOptionsListAction instead of inplace definition of vclForchosenMyOptions?".
In terms of :
<h:selectManyListbox id="theSelectManyCheckboxlistId" value="#{useOfMyOptionsList.chosenMyOptions}" valueChangeListener="#{useOfMyOptionsList.vclForchosenMyOptions}" >My implementation certainly may not be the best or most efficient way. Initially, I did not have the valueChangeListener part. I added that after so that I could trigger a method upon change of the selectManyListbox by the user. Actually, when doing so, useOfMyOptionsList.chosenMyOptions was not being assigned the new value when the method was run and therefore the first statement of vclForchosenMyOptions is:
By doing this, I can use the value of chosenMyOptions right away in the method. I suppose, it may in fact be redundant to also have the
value="#{useOfMyOptionsList.chosenMyOptions}"part also but I have not tried it without that part.
When I first got the s:convertEntity to work via the initial way (i.e., using components.xml), I literally cried out in joy, hugged my family, and took them to DisneyLand! It was so tough and such a long struggle to get that to actually work. Then when I got the 2nd way to work, I fealt happy that I finally was getting some trackion in bettering my understanding of Seam.
Jeff
Hello Jeff,
Just wanted to thank you again because your answers inspired me to achieve my objective and to find an appropriate solution. Now I move on to the new task.
So, finally, I didn't give up EntityHome/EntityQuery framework and it works just as needed:
- Factory is not a necessary thing to get converter (built-in) works - @Scope(CONVERSATION) is a MUST for a entity query component - dynamic list is defined at the EntityHome of a dependent entity (using @Datamodel annotation - I didn't check if it is mandatory) - more than one converter for different persistence units has been used (it works,but I didn't mix them at one page)
Have a good day!
Hello Alexander,
Sounds very good. Your insight is also helpful.
Have a nice day!
Jeff