[jboss-user] [JBoss Seam] - null pointer exception with fileUpload

vlaugier do-not-reply at jboss.com
Mon Jan 14 21:38:51 EST 2008


Hello,

I am making a forum where people can upload files to be shared. I can't make file upload work whereas I am in a very classical environment :
seam 1.2.1 CP1
jboss eap 4.2.0

filename and bytearray are seen as null in the SFSB

I have seen some people having quite the same problem but none of the case corresponds to my problem.

it might be silly but ....i am stuck

here is the web page : 

  | <!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:s="http://jboss.com/products/seam/taglib"
  |                  xmlns:ui="http://java.sun.com/jsf/facelets"
  |                  xmlns:f="http://java.sun.com/jsf"
  |                  xmlns:c="http://java.sun.com/jsf/core"
  |                  xmlns:h="http://java.sun.com/jsf/html"
  |                  xmlns:rich="http://richfaces.ajax4jsf.org/rich" 
  | 		 xmlns:a="https://ajax4jsf.dev.java.net/ajax" 
  |                  template="layout/template.xhtml">
  | 
  |   <ui:define name="body">
  | 
  | 	<h:form rendered="#{forum.id != 0}">			
  | 			<h:commandButton  value="Previous element" 
  | 			action="#{forumManager.previousElement}" />
  | 			<h:commandButton  value="Next element" 	
  | 			action="#{forumManager.nextElement}"/>
  | 	</h:form>
  | 
  |     <h:form id="createService" styleClass="edit">
  |       
  |         <rich:panel>
  |             <c:facet name="header">Forum #{forum.id}</c:facet>  
  |             
  |         <s:validateAll>
  |           
  |             <div class="input">
  |             <s:decorate  template="layout/edit.xhtml">
  |               <ui:define name="label">Product name :</ui:define>
  |               <h:inputText id="login" size="50" value="#{forum.product.name}" required="true" rendered="#{user.context == 1}"/>
  | 		<h:outputText id="loginOut" size="50" value="#{forum.product.name}" rendered="#{user.context == 0}"/>
  |             </s:decorate>
  |           </div>
  | 	  
  | 	  <div class="input">
  | 		  <s:decorate  template="layout/edit.xhtml">
  | 			  <ui:define name="label">Deal Id :</ui:define>
  | 			  <h:inputText  size="50" value="#{forum.deal.id}" required="true" rendered="#{user.context == 1}"/>
  | 			  <h:outputText size="50" value="#{forum.deal.id}" rendered="#{user.context == 0}"/>
  | 		  </s:decorate>
  |           </div>   
  |           
  | 	                      
  |   </s:validateAll>    
  |         
  |         <div style="clear:both"/>  
  |         
  |       </rich:panel> 
  |             
  |       
  |       <h:form enctype="multipart/form-data">
  | 	      <s:validateAll>
  | 		      <s:fileUpload data="#{forumManager.fileByteArray}" fileName="#{fileName}" />
  | 		      
  | 		      <h:commandButton action="#{forumManager.registerFile}" value="Upload file" styleClass="action"/>
  | 	      </s:validateAll>
  | 	</h:form>
  | 	
  |       
  |       <rich:tabPanel switchType="client">
  | 	      <rich:tab label="Discussion">
  | 	      
  | 	      		<rich:panel> 
  | 			<c:facet name="header" >Previous messages</c:facet>	
  | 			<h:dataTable value="#{forum.messages}" var="potentialEditedMessage" >								
  | 				
  | 				<h:column>
  | 					<c:facet name="header">date</c:facet>
  | 					<h:outputText value="#{potentialEditedMessage.submitTime}"/>
  | 				</h:column>
  | 				
  | 				<h:column>
  | 					<c:facet name="header">content</c:facet>
  | 					<h:outputText>
  | 						<s:formattedText value="#{potentialEditedMessage.content}"/>						
  | 					</h:outputText>						
  | 				</h:column>	
  | 				
  | 			</h:dataTable>
  | 
  | 				
  | 		      <div style="clear:both"/>  		      
  |       			</rich:panel> 
  | 		      
  | 		      <a:outputPanel id="msgPreview">
  | 			      
  | 			      <rich:panel>
  | 				      
  | 				      <c:facet name="header" >Message preview</c:facet>	
  | 				      
  | 				      <s:formattedText value="#{message.content}"/>
  | 				      
  | 				      <div style="clear:both"/>            
  | 				      
  | 			      </rich:panel>
  | 			      
  | 		      </a:outputPanel>
  | 		      
  | 		      
  | 		      
  | 		      <a:outputPanel id="msgEditor">  
  | 			      
  | 			      <h:form>
  | 				      
  | 				      <rich:panel>
  | 					      <c:facet name="header" ></c:facet>
  | 					      
  | 					      <h:inputTextarea id="text" value="#{message.content}" cols="100" rows="20"/>
  | 					      
  | 					      <div style="clear:both"/>        
  | 				      </rich:panel>
  | 				      
  | 				      <h:commandButton value="Preview message">
  | 					      <a:support event="onclick" disableDefault="true" reRender="msgPreview" /> 	
  | 				      </h:commandButton>				      
  | 				      				      
  | 				      <h:commandButton action="#{forumManager.registerMessage}" value="Submit message" styleClass="action"/>
  | 				      
  | 			      </h:form>
  | 			      
  | 		      </a:outputPanel>
  | 		      
  | 	      </rich:tab>
  | 	      
  | 	      
  | 	      <rich:tab label="Files">
  | 		      
  | 	      </rich:tab>
  | 	      
  |      	</rich:tabPanel>
  |      
  |       
  |     </h:form>
  |   </ui:define>
  | </ui:composition>
  | 
  | 


here is the SFSB :  interesting part in blue

  | package fr.helmet.bbpp.manager;
  | 
  | import fr.helmet.bbpp.entity.Forum;
  | import fr.helmet.bbpp.entity.Message;
  | import java.util.List;
  | 
  | import javax.ejb.Remove;
  | import javax.ejb.Stateful;
  | import javax.persistence.EntityManager;
  | import org.jboss.seam.annotations.Destroy;
  | import org.jboss.seam.annotations.Name;
  | import fr.helmet.bbpp.entity.User;
  | import java.io.FileOutputStream;
  | import java.util.LinkedList;
  | import org.jboss.seam.annotations.Begin;
  | import org.jboss.seam.annotations.End;
  | import org.jboss.seam.annotations.In;
  | import org.jboss.seam.annotations.Out;
  | import org.jboss.seam.core.FacesMessages;
  | import org.jboss.seam.annotations.Logger;
  | import org.jboss.seam.annotations.datamodel.DataModel;
  | import org.jboss.seam.log.Log;
  | import javax.persistence.Query;
  | 
  | @Stateful
  | @Name("forumManager")
  | //@Scope(ScopeType.EVENT)
  | public class ForumManagerBean implements ForumManager, java.io.Serializable {
  |     
  |     @Logger
  |     private Log logger ;
  |     
  |     @DataModel
  |     List<Forum> forums = new LinkedList<Forum>();
  |     
  |     @In(required=false)
  |     @Out(required=false)
  |     private Message message;
  | 
  | 
  |     private byte[] fileByteArray;
  |     
  |     @In(required=false)
  |     @Out(required=false)
  |     private String fileName;
  |     
  | 
  |     //@PersistenceContext 
  |     //EntityManager em;
  | 
  |     @In EntityManager entityManager;
  |     
  |     @In(required=false)
  |     @Out(required=false)
  |     Forum forum ;
  |     
  |     @In(required=false)
  |     @Out(required=false)
  |     User user;
  |     
  |    @In FacesMessages facesMessages;
  | 
  | 
  |    
  |     @Remove @Destroy 
  |     public void destroy() {
  |   //     SystentityManager.out.println("Entree dans Destroy");
  |     }
  |     
  |     
  |     public void nextElement(){
  |           
  |       int i = user.getForums().indexOf(user.getForum());           
  |       i++;           
  |       if (i > user.getForums().size()-1) i=0;
  |       
  |       user.setForum(user.getForums().get(i));                         
  |       this.forum = entityManager.find(Forum.class,user.getForum().getId());
  |     }
  |     
  |     public void previousElement(){
  |           
  |       int i = user.getForums().indexOf(user.getForum());           
  |       i--;           
  |       if (i < 1) i = user.getForums().size()-1;
  |       
  |       user.setForum(user.getForums().get(i));                         
  |       this.forum = entityManager.find(Forum.class,user.getForum().getId());
  |     }
  |     
  |     
  |     public void registerFile() {
  |         
  |         logger.info("IN registerFile");
  |         
  |         System.out.println("name of file = " + this.fileName);
  |         
  |         //System.out.println("size of byte array = " + this.fileByteArray.length);
  |         
  |         
  |         String filePath  = "/home/vlaugier/Developpement/UPLOADED_FILES/" + this.fileName;
  |         try {
  |             FileOutputStream file =  new FileOutputStream(filePath) ;
  |             file.write(this.fileByteArray);
  |         } catch (Exception ex) {logger.fatal("could not save uploaded file");}
  |         
  |     }
  | 
  | 
  |     public void registerMessage()
  |     {        
  |         this.message.setForum(this.forum);                 
  |         entityManager.merge(this.message);
  |         
  |         String queryString = "select m from Message m WHERE m.forum=?";
  |         Query query = entityManager.createQuery(queryString);
  |         query.setParameter(1,forum);
  |         this.forum.setMessages(query.getResultList());
  |         
  |     }
  |     
  |     
  |     @End
  |     public void registerForum(Forum forum )
  |     {
  |    //     SystentityManager.out.println("enregistrement du forum " + forum );
  |    //     SystentityManager.out.println("Parent du forum :" + forum .getParentForum());
  |         entityManager.persist(forum );
  |         
  |         FacesMessages.instance().add("Nouveau Forum enregistré dans le catalogue!") ;
  |         user.setContext(user.READING); // back to READING mode
  |         forum = null; 
  |     }
  |     
  |     
  |     @End
  |     public String updateForum() {
  |         //System.out.println("mise à jour");
  |         entityManager.merge(forum );
  |         
  |         user.setContext(user.READING); // back to READING mode
  |         FacesMessages.instance().add("Forum successfully updated !") ;
  |         
  |         return null;
  |     }
  |     
  |     
  |     @Begin(join=true)
  |     public String viewForum(Forum serv) {
  |         
  |         this.forum = serv;
  |         
  |         user.setContext(user.READING);
  |         
  |         //facesMessages.add("editAccount " + this.client.getAccount().getFullname());
  |         //this.account = client.getAccount();
  |         return "createProduct";
  |     }
  |     
  |     
  |     @Begin(join=true)
  |     public void editForum(Forum serv){
  |         
  |         this.forum = serv;        
  |               
  |         user.setContext(user.WRITING);
  |         
  |     }
  |     
  |     
  |     @Begin(join=true)
  |     public String startCreateForum() {
  |         
  |         user.setContext(user.WRITING);
  |         
  |         return "createProduct" ;
  |     }    
  |     
  |     public List<Forum> getForums()
  |     {
  |         return forums;
  |     }
  |     
  |     public void setForums(List<Forum> forums)
  |     {
  |         this.forums=forums;
  |     }
  |     
  | 
  |     public Forum getForum() {
  |         return forum;
  |     }
  |     
  |     
  |    @Begin(join=true)
  |    public String defineFromUserForum() {
  |        try {
  |         this.forum = entityManager.find(Forum.class,user.getForum().getId());
  |        }catch (Exception ex) {facesMessages.add("You have no element selected for this page yet");}
  |        return "createForum";
  |    }
  |    
  |    @Begin(join=true)
  |    public String defineFromUserForums() {
  |        //logger.info(user.getForums().size());
  |        this.forums = new LinkedList<Forum>();
  |        try {
  |             for (Forum frm : user.getForums()) {
  |                 this.forums.add ( entityManager.find(Forum.class,frm.getId()) ) ;
  |             }        
  |             this.forum = this.forums.get(0);
  |        } catch (Exception ex) {facesMessages.add("You have no element selected for this page yet");}
  |        return "createForum";
  |    }
  |    
  |     public byte[] getFileByteArray() {
  |         return fileByteArray;
  |     }
  | 
  |     public void setFileByteArray(byte[] fileByteArray) {
  |         this.fileByteArray = fileByteArray;
  |     }
  | 
  | 
  |      
  | }
  | 


here is the component.xml : (but I have not changed anything in it)

  | <?xml version="1.0" encoding="UTF-8"?>
  | <components xmlns="http://jboss.com/products/seam/components"
  |             xmlns:core="http://jboss.com/products/seam/core"
  |             xmlns:drools="http://jboss.com/products/seam/drools"
  |             xmlns:security="http://jboss.com/products/seam/security"
  |             xmlns:mail="http://jboss.com/products/seam/mail" 
  |             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  |             xmlns:framework="http://jboss.com/products/seam/framework" 
  |             xsi:schemaLocation=
  |                 "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-1.2.xsd 
  |                  http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-1.2.xsd
  |                  http://jboss.com/products/seam/security http://jboss.com/products/seam/security-1.2.xsd
  |                  http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-1.2.xsd
  |                  http://jboss.com/products/seam/components http://jboss.com/products/seam/components-1.2.xsd">
  | 
  |    <core:init debug="@debug@" jndi-pattern="@jndiPattern@"/>
  |      
  |    <core:manager concurrent-request-timeout="500" 
  |                  conversation-timeout="120000" 
  |                  conversation-id-parameter="cid" 
  |                  conversation-is-long-running-parameter="clr"/>
  |     
  |    <core:managed-persistence-context name="entityManager"
  |                               auto-create="true"
  |                persistence-unit-jndi-name="java:/bbppEntityManagerFactory"/>
  | 
  |    <core:ejb installed="@embeddedEjb@"/>
  |    
  |    <drools:rule-base name="securityRules">
  |        <drools:rule-files>
  |            <value>/security.drl</value>
  |        </drools:rule-files>
  |    </drools:rule-base>
  | 
  |    <security:identity authenticate-method="#{authenticator.authenticate}"
  |                            security-rules="#{securityRules}"/>
  |    
  |    <event type="org.jboss.seam.notLoggedIn">
  |        <action expression="#{redirect.captureCurrentView}"/>
  |    </event>
  |    <event type="org.jboss.seam.postAuthenticate">
  |        <action expression="#{redirect.returnToCapturedView}"/>
  |    </event>
  |    
  |                           
  |    <mail:mail-session host="localhost" port="2525" username="test" password="test" />
  |         
  |    <!-- For use with jBPM pageflow or process management -->
  |    <!--  
  |    <core:jbpm>
  |       <core:process-definitions></core:process-definitions>
  |       <core:pageflow-definitions></core:pageflow-definitions>
  |    </core:jbpm>
  |    -->
  |    <framework:entity-query name="moralEntityQuery" ejbql="select m from MoralEntity m" />   
  |    <framework:entity-query name="companyQuery" ejbql="select c from Company c" />   
  |    <framework:entity-query name="agentQuery" ejbql="select a from Agent a" />   
  |    <framework:entity-query name="roleQuery" ejbql="select r from Role r" />
  |    <framework:entity-query name="dealQuery" ejbql="select d from Deal d" />
  |    <framework:entity-query name="productQuery" ejbql="select p from Product p" />
  |    
  | </components>
  | 
  | 


and the web.xml :

  | <?xml version="1.0" ?>
  | <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  |          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  |          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  |          version="2.4">
  | 
  |     <!-- Ajax4jsf (must come first!) -->
  |     
  |     <filter>
  |         <display-name>Ajax4jsf Filter</display-name>
  |         <filter-name>ajax4jsf</filter-name>
  |         <filter-class>org.ajax4jsf.Filter</filter-class>
  |     </filter>
  |     
  |     <filter-mapping>
  |         <filter-name>ajax4jsf</filter-name>
  |         <url-pattern>*.seam</url-pattern>
  |     </filter-mapping>
  |     
  |     <context-param>
  |         <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
  |         <param-value>org.jboss.seam.ui.facelet.SeamFaceletViewHandler</param-value>
  |     </context-param>
  |     
  |     <context-param>
  |         <param-name>org.ajax4jsf.SKIN</param-name>
  |         <param-value>blueSky</param-value>
  |     </context-param>
  |  
  |    <!-- Seam -->
  |     
  |    <listener>
  |       <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
  |    </listener>
  |     
  |     <filter>
  |         <filter-name>Seam Filter</filter-name>
  |         <filter-class>org.jboss.seam.web.SeamFilter</filter-class>
  |     </filter>
  | 
  |     <filter-mapping>
  |         <filter-name>Seam Filter</filter-name>
  |         <url-pattern>/*</url-pattern>
  |     </filter-mapping>
  |  
  |    <servlet>
  |       <servlet-name>Seam Resource Servlet</servlet-name>
  |       <servlet-class>org.jboss.seam.servlet.ResourceServlet</servlet-class>
  |    </servlet>
  |     
  |    <servlet-mapping>
  |       <servlet-name>Seam Resource Servlet</servlet-name>
  |       <url-pattern>/seam/resource/*</url-pattern>
  |    </servlet-mapping>
  |    
  |    <!-- MyFaces -->   
  |    <!--
  |    <listener>
  |       <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  |    </listener>
  |    -->
  |    
  |    <!-- SUN Faces instead of MyFaces -->
  |    <listener>
  |         <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  |     </listener>
  |    
  |    <!-- Facelets development mode (disable in production) -->
  |    
  |    <context-param>
  |       <param-name>facelets.DEVELOPMENT</param-name>
  |       <param-value>true</param-value>
  |    </context-param>
  |     
  |    <!-- JSF -->
  |     
  |    <context-param>
  |       <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  |       <param-value>client</param-value>
  |    </context-param>
  |     
  |    <context-param>
  |       <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
  |       <param-value>.xhtml</param-value>
  |    </context-param>
  | 
  |    <servlet>
  |       <servlet-name>Faces Servlet</servlet-name>
  |       <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  |       <load-on-startup>1</load-on-startup>
  |    </servlet>
  |     
  |    <servlet-mapping>
  |       <servlet-name>Faces Servlet</servlet-name>
  |       <url-pattern>*.seam</url-pattern>
  |    </servlet-mapping>
  |                   
  |    <security-constraint> 
  |        <display-name>Restrict raw XHTML Documents</display-name>
  |        <web-resource-collection>
  |            <web-resource-name>XHTML</web-resource-name>
  |            <url-pattern>*.xhtml</url-pattern>
  |        </web-resource-collection>
  |        <auth-constraint>
  |            <role-name>NONE</role-name>
  |        </auth-constraint>
  |    </security-constraint>
  |    
  | </web-app>
  | 
  | 

I hae not changed anything in the application.xml

thanks for your help

Vincent

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

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4119886




More information about the jboss-user mailing list