Form wizard and conversation scope issue
shavo26 Jun 15, 2010 7:45 PMEnvironment: Seam 2.2.0.GA JDK 1.6 JBOSS 5.1.0.GA Hibernate 3.3.0.GA
Im having an issue setting up a simple form wizard.
Steps are:
* Screen #1: submit inquiry form detail * Screen #2: add attachment(s) * Screen #3: confirm attachment list
Im on screen 2 and when i add attachment to inquiry, they are not been stored. I am using a stateful session bean, which default scope is conversation for my action class.
I have a radio button on screen one adding inqiry, isAddAttachments. If true then i go to screen two and upload as many attachments as i want before submitting. I outject newInquiry to conversation scope so i take its stored there until i end the conversation. problem is every time i add an attachment the size of the list is one.
Why is that? Is it a problem around seam component newAttachment or the way im storing my newInquiry context variable?
Snippet Code for action class is:
@Stateful
@Name(value="inquiry")
public class InquiryAction implements Inquiry {
@org.jboss.seam.annotations.In
@Out
private inquiry.model.Inquiry newInquiry;
@In(required=false)
Attachment newAttachment;
@Logger private Log log;
@In
private Renderer renderer;
@In
private EntityManager entityManager;
@org.jboss.seam.annotations.In
private org.jboss.seam.faces.FacesMessages facesMessages;
@Begin
public String addInquiry(){
if(newInquiry.getEmail().trim().equals(newInquiry.getConfirmEmail().trim())){
//store pdf in document
byte[] pdf = this.createPDF();
newInquiry.setPdfDocument(pdf);
if(!newInquiry.isAddAttachments()){
entityManager.persist(newInquiry);
this.sendEmail();
facesMessages.add("Successfully submitted web inquiry form");
}
return "success";
}else{
facesMessages.add("Email addresses do not match");
return null;
}
}
@End
public void save(){
entityManager.persist(newInquiry);
this.sendEmail();
facesMessages.add("Successfully submitted web inquiry form");
}
public void addAttachment(){
newInquiry.getAttachments().add(newAttachment);
facesMessages.add("Added attachment to inquiry form {0}",newAttachment.getFileName());
}
@End
public String cancel(){
return "/home.xhtml";
}Inquiry entity is:
@Entity
@Name(value = "newInquiry")
public class Inquiry implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private long id;
private String question;
private String entityNumber;
private String entityName;
private Title title;
private String givenName;
private String familyName;
private String telephoneNumber;
private String email;
private QuestionType questionType;
private String timeToCall;
private String confirmEmail;
private boolean addAttachments;
private byte[] pdfDocument;
private Set<Attachment> attachments = new HashSet<Attachment>(0);
@Embedded
@AttributeOverrides( {
@AttributeOverride(name="countryCode", column = @Column(name="countryCode")) } )
private Address address = new Address();
public Inquiry(){
}
@Id
@GeneratedValue
public long getId() {
return id;
}
public void setId(long id){
this.id = id;
}
@Column(name = "pdfDoc")
@Basic(fetch = FetchType.LAZY)
public byte[] getPdfDocument() {
return pdfDocument;
}
public void setPdfDocument(byte[] pdfDocument) {
this.pdfDocument = pdfDocument;
}
@Transient
public boolean isAddAttachments() {
return addAttachments;
}
public void setAddAttachments(boolean addAttachments) {
this.addAttachments = addAttachments;
}
@NotNull
@Column(nullable = false)
public String getTimeToCall() {
return timeToCall;
}
public void setTimeToCall(String timeToCall) {
this.timeToCall = timeToCall;
}
@Enumerated(EnumType.STRING)
public QuestionType getQuestionType() {
return questionType;
}
public void setQuestionType(QuestionType questionType) {
this.questionType = questionType;
}
@Column(length = 5000)
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
@Column(length = 9, nullable = false)
@NotNull
public String getEntityNumber() {
return entityNumber;
}
public void setEntityNumber(String entityNumber) {
this.entityNumber = entityNumber;
}
public String getEntityName() {
return entityName;
}
public void setEntityName(String entityName) {
this.entityName = entityName;
}
@Enumerated(EnumType.STRING)
public Title getTitle() {
return title;
}
public void setTitle(Title title) {
this.title = title;
}
@NotNull
public String getGivenName() {
return givenName;
}
public void setGivenName(String givenName) {
this.givenName = givenName;
}
@NotNull
public String getFamilyName() {
return familyName;
}
public void setFamilyName(String familyName) {
this.familyName = familyName;
}
@NotNull
@Column(name = "phoneNo")
public String getTelephoneNumber() {
return telephoneNumber;
}
public void setTelephoneNumber(String telephoneNumber) {
this.telephoneNumber = telephoneNumber;
}
@Email()
@NotNull
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Transient
public String getConfirmEmail(){
return this.confirmEmail;
}
public void setConfirmEmail(String email) {
this.confirmEmail = email;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "inquiry")
public Set<Attachment> getAttachments() {
return attachments;
}
public void setAttachments(Set<Attachment> attachments) {
this.attachments = attachments;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}Attachment screen snippet is:
<h:form enctype="multipart/form-data" id="attachmentForm" styleClass="edit">
<rich:panel>
<f:facet name="header">General Inquiry form - Attachments</f:facet>
<s:decorate id="descField" template="layout/edit.xhtml">
<ui:define name="label">Description of Document</ui:define>
<h:inputText id="description"
value="#{newAttachment.description}"/>
</s:decorate>
<s:decorate id="fileUploadDecoration" template="layout/edit.xhtml">
<ui:define name="label">Pathname</ui:define>
<s:fileUpload id="file"
data="#{newAttachment.doc}"
contentType="#{newAttachment.fileContentType}"
fileName="#{newAttachment.fileName}"
fileSize="#{newAttachment.fileSize}" />
</s:decorate>
<div style="clear:both">
<span class="required">*</span>
required fields
</div>
</rich:panel>
<div class="actionButtons">
<h:commandButton value="Upload"
action="#{inquiry.addAttachment}"/>
<h:commandButton value="Next"
action="#{inquiry.save}"/>
</div>
<s:link view="/attachmentList.xhtml" value="Attachment Summary"/>
</h:form>Thanks,
Shane.