Struts2 Upload de Arquivo c/ multipart/form-data - Nullpointer

Estou obtendo Nullpointer exception quando faço o upload de arquivo com struts2.
será que falta alguma configuracao.

Estou usando multipart/form-data no formulario.

	<s:form action="cadQuestaoXml" namespace="/crud" theme="simple" 
			method="POST" enctype="multipart/form-data">

Em que linha da action? O arquivo é setado na variável File? Você tem uma variável file de mesmo nome do atributo name da tag s:file na jsp?

Linha 55 da action

Codigo do formulario

	<s:form action="cadQuestaoXml" namespace="/crud" theme="simple" 
			method="POST" enctype="multipart/form-data">
		
		<table id="tabela">
			<tr>
				<td><s:text name="questao.form_row_select_certificacao"/></td>
				<td rowspan="2"><s:doubleselect 
									label="Certificacao"
									name="idCertificacao" 
									list="certificacoes" 
									listKey="id"
									listValue="nome" 
									value="'id'" 
									doubleValue="'id'"
									doubleList="competencias" 
									doubleListKey="id" 
									doubleListValue="nome"
									doubleName="idCompetencia" 
									theme="simple" />
				</td>
			</tr>
			<tr>
				<td><s:text name="questao.form_row_select_competencia"/></td>
			</tr>
			<tr>
				<td><s:text name="questao.form_row_arquivo"/></td>
				<td align="left">
					<s:file name="upload" theme="simple" size="50" />
				</td>
			</tr>
			<tr>
				<td>&nbsp;</td>
				<td align="left"><s:submit value="Cadastrar" method="parser" /></td>
			</tr>
		</table>
	</s:form>

codigo da action

package action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import parserxml.EventHandler;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.OgnlValueStack;

import dao.CertificacaoDao;
import dao.CompetenciaDao;
import dao.QuestaoDao;
import entidades.Certificacao;
import entidades.Competencia;
import entidades.Parametro;

public class QuestaoAction extends ActionSupport implements ServletRequestAware{

	private static final long serialVersionUID = 6266088461853095687L;
	private int idCertificacao;
	private String idCompetencia;
	//private String arquivo;

	private File upload;//The actual file
    private String uploadContentType; //The content type of the file
    private String uploadFileName; //The uploaded file name
	
	private ArrayList<Competencia> competencias = new ArrayList<Competencia>();
	private ArrayList<Parametro> totalizador;
	private ArrayList<Certificacao> certificacoes;
	
	private CompetenciaDao competenciaDao; //dependency injection
	private QuestaoDao questaoDao;
	private CertificacaoDao certificacaoDao;
	
	private HttpServletRequest request;
	
    private static void copyFile(File in, File out) {  
        try {   
            FileChannel sourceChannel = new FileInputStream(in).getChannel();   
            FileChannel destinationChannel = new FileOutputStream(out).getChannel();   
            sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel);   
            sourceChannel.close();   
            destinationChannel.close();   
        } catch (IOException ex) {   
            ex.printStackTrace();   
        }   
    } 
	
	public String parser() throws Exception {
	    //um parse eh criado atraves de um SAXParserFactory
        SAXParser parser;
		try {
			System.out.println(uploadFileName);

			copyFile(upload, new File("c:\\uploads\\"+ uploadFileName));   
			
			parser = SAXParserFactory.newInstance().newSAXParser();
			
			//FileInputStream eh usado par InputSource
	        InputSource input = new InputSource("c:\\uploads\\"+ uploadFileName);

	        //informa para o parse qual classe vai processar os eventos: EventHandler.java
	        parser.parse(input, new EventHandler(idCompetencia, questaoDao));
	        
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SUCCESS;
	}
	
	@Override
	public String execute() throws Exception {	
		return SUCCESS;
	}
	
	//getters e setters
	public int getIdCertificacao() {
		return idCertificacao;
	}
	public void setIdCertificacao(int idCertificacao) {
		this.idCertificacao = idCertificacao;
	}
	public String getIdCompetencia() {
		return idCompetencia;
	}
	public void setIdCompetencia(String idCompetencia) {
		this.idCompetencia = idCompetencia;
	}
	
	//get e set de file
	public File getUpload() {
		return upload;
	}

	public void setUpload(File upload) {
		this.upload = upload;
	}

	public String getUploadContentType() {
		return uploadContentType;
	}

	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public String getUploadFileName() {
		return uploadFileName;
	}

	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	/*
	public String getArquivo() {
		return arquivo;
	}
	public void setArquivo(String arquivo) {
		this.arquivo = arquivo;
	}
	*/
	
	public ArrayList<Parametro> getTotalizador() {
		String cpf = request.getRemoteUser();
		totalizador = questaoDao.getTotalizadores(cpf);
		return totalizador;
	}
	public void setTotalizador(ArrayList<Parametro> totalizador) {
		this.totalizador = totalizador;
	}
	public ArrayList<Competencia> getCompetencias() {
		String cpf = request.getRemoteUser();
		OgnlValueStack stack = (OgnlValueStack) 
			ServletActionContext.getValueStack(ServletActionContext.getRequest());
		Object tipoCert = stack.findValue("top");
		if(tipoCert!=null && tipoCert instanceof Certificacao) {
			Certificacao cert = (Certificacao)tipoCert;
        	competencias = competenciaDao.listaTodasCompetencia(cpf,cert.getId());
		}
		return competencias;
	}
	public void setCompetencias(ArrayList<Competencia> competencias) {
		this.competencias = competencias;
	}
	public ArrayList<Certificacao> getCertificacoes() {
		//apenas as certificacoes do gestor
		String cpf = request.getRemoteUser();
		certificacoes = certificacaoDao.listaTodosCertificacao(cpf);
		return certificacoes;
	}
	public void setCertificacoes(ArrayList<Certificacao> certificacoes) {
		this.certificacoes = certificacoes;
	}
	public CompetenciaDao getCompetenciaDao() {
		return competenciaDao;
	}
	public void setCompetenciaDao(CompetenciaDao competenciaDao) {
		this.competenciaDao = competenciaDao;
	}
	public QuestaoDao getQuestaoDao() {
		return questaoDao;
	}
	public void setQuestaoDao(QuestaoDao questaoDao) {
		this.questaoDao = questaoDao;
	}
	public CertificacaoDao getCertificacaoDao() {
		return certificacaoDao;
	}
	public void setCertificacaoDao(CertificacaoDao certificacaoDao) {
		this.certificacaoDao = certificacaoDao;
	}
	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		request = arg0;
	}
}

Pô cara, e a exception, rola onde?

– edit Foi mal, não vi que você disse a linha.

Aparentemente, tá certo. Já rodou em debug, botando breakpoint no setUpload?