Hi guys,

in a Seam/JSF/Facelets evaluation project I ran into the following problem. 
Looks like there is a problem if you use embeddable Objects in Entity beans. 

Consider the following entity bean containing an embedded object: @Entity
  | @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
  | @DiscriminatorColumn(name = "TYPE", discriminatorType = 
DiscriminatorType.STRING)
  | @Table (name = "CLassAB")
  | @Name("classA")
  | public class ClassA 
  |     implements java.io.Serializable {
  | 
  |     @Id
  |     @GeneratedValue
  |     @Column (name = "Id")
  |     private int id;
  | 
  |     @Column (name = "Var1", nullable=false, length=3)
  |     @NotNull @Length(min=2, max=3)
  |     private String var1;
  | 
  |     @Embedded                                        // <-------  trouble 
maker
  |     private ClassE classEInst;
  | 
  |     @Basic
  |     private Double latitude;
  | 
  |     @Basic
  |     private Double longitude;
  | 
  | 
  | 
  |     public int getId() {
  |             return id;
  |     }
  | 
  |     protected void setId(int id) {
  |             this.id = id;
  |     }
  | 
  | 
  |     public String getVar1() {
  |             return var1;
  |     }
  | 
  |     public void setVar1(String var1) {
  |             this.var1 = var1;
  |     }
  | 
  |     
  |     public ClassE getClassEInst()
  |     {
  |             return classEInst;
  |     }
  |     
  |     public void setClassEInst(ClassE classEInst)
  |     {
  |             this.classEInst = classEInst;
  |     }
  | 
  | 
  |     public Double getLatitude() {
  |             return latitude;
  |     }
  | 
  | 
  |     public void setLatitude(Double latitude) {
  |             this.latitude = latitude;
  |     }
  | 
  |     public Double getLongitude() {
  |             return longitude;
  |     }
  | 
  |     public void setLongitude(Double longitude) {
  |             this.longitude = longitude;
  |     }
  |     
  |     public GeoPoint getLocation() {
  |             return new GeoPoint(latitude,longitude);
  |     }
  | 
  | 
  |     public String toString() {
  |             return var1;
  |     }
  | }Please disregard the inheritance. You don't need to bother with it for 
this issue.

ClassE just contains a single integer in this test [EMAIL PROTECTED]
  | public class ClassE 
  |     implements java.io.Serializable {
  | 
  |     private int classEVar;
  | 
  | 
  |     public ClassE() {
  |     }
  | 
  | 
  |     public ClassE(int classEContents) {
  |             this.classEVar = classEContents;
  |     }
  | 
  |     public int getClassEVar() {
  |             return classEVar;
  |     }
  |     
  |     public void setClassEVar(int classEVar) {
  |             this.classEVar = classEVar;
  |     }

The problem arises in a JSF page where I want to edit instances of entity bean 
ClassA (classAEdit.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:o="http://www.optimizer.de/jsf";
  |                             template="template.xhtml">
  | 
  | <!-- content -->
  | <ui:define name="content">
  | <div class="section">
  |     <h1>Edit ClassA - Test</h1>
  |     <h:form>
  |             <fieldset>
  |             <o:classA-input classAInst="#{classASearch.selectedClassAInst}" 
showId="#{false}" />                        // <-------------    (1)
  |                     <div class="entry errors"><h:messages globalOnly="true" 
/></div>
  |                     <div class="entry">
  |                             <div class="input">
  |                                     <h:commandButton value="Save" 
action="#{classAEdit.update}" class="button"/> 
  |                                     <h:commandButton value="Delete" 
action="#{classAEdit.delete}" class="button"/> 
  |                                     <s:link value="Cancel" 
action="classAList" linkStyle="button" buttonClass="button"/>
  |                             </div>
  |                     </div>
  |             </fieldset>
  |     </h:form>
  | </div>
  | </ui:define>
  | </ui:composition>
Take a look at (1). 
tag classA-input is defined in a facelets tag lib (classA-input.xhtml)<!DOCTYPE 
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
  | <html 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:c="http://java.sun.com/jstl/core";
  |       xmlns:fn="http://java.sun.com/jsp/jstl/functions";
  |       xmlns:s="http://jboss.com/products/seam/taglib";
  |       xmlns:o="http://www.optimizer.de/jsf";>
  | <ui:composition>
  |     <div class="entry">
  |             <div class="label"><h:outputLabel 
for="id">ID:</h:outputLabel></div>
  |             <div class="output"><h:outputText 
id="id">#{classAInst.id}</h:outputText></div>
  |     </div>
  |     <div class="entry">
  |             <div class="label"><h:outputLabel for="classEInst">Class E 
Instance (embedded):</h:outputLabel></div>
  |             <div class="input">
  |                     <h:inputText id="classEInst" 
value="#{classAInst.classEInst}" /><br/>           // <------------------  (2)
  |                     <span class="errors"><h:message for="classEInst" 
/></span>
  |             </div>
  |     </div>
  |     <div class="entry">
  |             <div class="label"><h:outputLabel 
for="latitude">Latitude:</h:outputLabel></div>
  |             <div class="input">
  |                     <h:inputText id="latitude" 
value="#{classAInst.latitude}" /><br/>
  |                     <span class="errors"><h:message for="latitude" /></span>
  |             </div>
  |     </div>
  |     <div class="entry">
  |             <div class="label"><h:outputLabel 
for="longitude">Longitude:</h:outputLabel></div>
  |             <div class="input">
  |                     <h:inputText id="longitude" 
value="#{classAInst.longitude}" /><br/>
  |                     <span class="errors"><h:message for="longitude" 
/></span>
  |             </div>
  |     </div>
  | </ui:composition>
  | </html>In (1) an input field with contents  
`{{classASearch.selectedClassAInst} is created. 

Here is the relevant part of classASearch: @Stateful
  | @Name("classASearch")
  | @Scope(ScopeType.SESSION)
  | public class ClassASearchAction implements ClassASearch
  | {
  |    @PersistenceContext
  |    private EntityManager em;
  |    
  |    private String searchString;
  |    
  |    @DataModel
  |    private List<ClassA> classAInstList;
  |    @DataModelSelection
  |    @Valid
  |    private ClassA selectedClassAInst;                   // 
<--------------------
  | [...]
  | }

The interesting part is that everything works fine if the ClassE instance is 
displayed in (2). However, if you change the contents and want to save, you'll 
get an error - apparingly from MyFaces:

/WEB-INF/facelets/tags/classA-input.xhtml @20,68 
value="#{classAInst.classEInst}": Exception setting property classEInst of base 
with class test.ClassB
[hint: classA-input.xhtml @20,68 is (2)]

Since the code works fine for Strings or - as you can see above - doubles, but 
fails with embedded objects, I guess MyFaces is not compatible with @Embedded 
Objects created by EJB3/Hibernate. 

However, I don't know where to file the bug. Is MyFaces supposed to deal 
correctly with an EJB3 embedded obejct? Or is Hibernate/EJB3 implementing the 
embedded object in a strange way so that MyFaces can't deal correctly with the 
code? Or are JBoss and MyFaces just not as compatible as they should be?


So is this a bug or a feature request? File a bug in the JBoss or in the Apache 
JIRA???

---
BTW, the problem seems to arise in PropertyResolverImpl.setValue(). In  
http://myfaces.apache.org/impl/xref/org/apache/myfaces/el/PropertyResolverImpl.html
  you can see the error is thrown in the catch (RuntimeException e) part in 
setValue(). 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3958497#3958497

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3958497
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to