Struts x Problemas com 2 posts realizados simultaneamente

0 respostas
yannickbh

Galera, to com um problemasso… Estou com um sistema em produção onde foi descoberto um BUG q eu não faço a menor idéia d como resolve-lo. Espero q possam ajudar.

É o seguinte, num dado momento, ao realizar um post simultaneamente ( ou seja, 2 usuários pressionam enter e é enviado os dados do formulário para um método do struts) acontece um null pointer ao processar os dados que chegam do struts. Segue abaixo meu codigo:

Metodo que é chamado pelo form

public ActionForward despesas(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
			HttpServletResponse response) throws Exception {		
		/*
		 * TODO
		 * 1. Validar conta débito
		 * 2. Incluir / Alterar / Excluir despesas na lista 
		 * 2. Somar valor total das despesas
		 * 3. Calcular CPMF
		 * 4. Gerar valor por extenso
		 * 
		 * OBS: não realizar a inclusão no SGBD pois sera feito na inclusão da solicitação
		 */		 

		ActionErrors errors = new ActionErrors();
		
		try{ 
			
			getRequest(mapping, form, request, response);
			getPerfil(mapping, form, request, response);
			
			solicitacao = new Solicitacao();
			
			// Somente validar se o usuário selecionar conta - zero representa conta no combo da tela
			if(!despesaVO.getNumeroConta().equals("")){ 
				solicitacao.validarContaDebito(despesaVO);
			}
			
			if(despesaVO.getOperacaoDespesa().equalsIgnoreCase("alterar") || despesaVO.getOperacaoDespesa().equalsIgnoreCase("excluir")){		
				
				listaDespesas.remove(despesaVO.getSequencia()-1);
				
				if(despesaVO.getOperacaoDespesa().equalsIgnoreCase("alterar")){
					listaDespesas.add(despesaVO);
				}
				
			}else{
				listaDespesas.add(despesaVO);
			}
			
			Despesas despesas = new Despesas(listaDespesas, despesaVO.getSessionId());		
				
			despesas.calcularTotal(despesaVO);
			despesas.calcularCpmf();		
			
			solicitacaoVO.setIdAliquotaCPMF(despesas.getAliquotaCpmfVO().getIdAliquota());
			solicitacaoVO.setExtenso(despesas.gerarValorPorExtenso());
			solicitacaoVO.setValorTotalSolicitado(despesas.getTotalDespesasSolicitacao());
			
			if( perfil.equals(Perfil.CONTROLLER_ADMINISTRADOR) || perfil.equals(Perfil.CONTROLLER_ANALISTA) ){				
				solicitacaoVO.setExtenso(despesas.gerarValorAprovadoPorExtenso());
				solicitacaoVO.setValorTotalAprovado(despesas.getTotalDespesasSolicitacaoAprovada());
			}
			
			if(!despesaVO.getOperacaoDespesa().equalsIgnoreCase("excluir")){
				ItemDespesaVO itemDespesaVO = new ItemDespesaVO();
				ItemDespesa itemDespesa = new ItemDespesa();
				itemDespesaVO = itemDespesa.consulta(Integer.parseInt(despesaVO.getCmbLstDespesas()));
				despesaVO.setDescricao(itemDespesaVO.getdescricao());		
			}
			
			listaDespesas = despesas.getListaDespesas();

			solicitacaoVO.setQtdDespesas(listaDespesas.size());
			
			/* 
			 * Mecanismo utilizado para identificar se alguma despesa possue pendência de informação a
			 * fim de evitar que a solicitação seja aprovada pelo controller sem que a pêndencia tenha
			 * sido corrigida.
			 */
			if(despesas.isPendente()){
				solicitacaoVO.setPendente("1");
			}else{
				solicitacaoVO.setPendente("0");
			}
			
			despesaVO = new DespesaVO();
                                                despesaVO.setSessionId(session.getId());
			
		}catch(Exception e){
			e.printStackTrace();
			errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(CommonKeys.ERRO_INESPERADO, e.getMessage()));
			request.setAttribute("campoErro_CXPQ", "numeroConta");
			this.saveErrors(request, errors);
		}
		setRequest(mapping, form, request, response);
		return mapping.findForward((errors.isEmpty() ? CommonKeys.SUCESSO : CommonKeys.FALHA));
	}

Método que recebe os dados da request

private void getRequest(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
			HttpServletResponse response) throws Exception {
		
		HttpSession session = obterSession(request);		
									
		aprovacaoVO = new AprovacaoVO();
		BeanUtils.copyProperties(aprovacaoVO, form);
		
		despesaVO = new DespesaVO();
		BeanUtils.copyProperties(despesaVO, form);
		
		usuarioSapVO = new UsuarioSapVO();
		BeanUtils.copyProperties(usuarioSapVO, form);
				
		solicitacaoVO = new SolicitacaoVO();
		BeanUtils.copyProperties(solicitacaoVO, form);

		lstItemDespesaVO = new ArrayList<ItemDespesaVO>();
		BeanUtils.copyProperties(lstItemDespesaVO, form);

		lstControllers = new ArrayList<UsuarioVO>();
		BeanUtils.copyProperties(lstControllers, form);
		
	}

O null pointer acontece, no debugg, em qualquer teste q realizo com o objeto despesaVO, quando ele passa pela 2 vez. Da primeira vez ele processa corretamente. Alguem tem alguma luz pra me dar??

Obs: utilizo a sessionId na despesa, pois a lista fica em memoria e para q as listas não se misturem, até q o usuário faça a inclusão. ( Ele pode incluir, alterar e excluir na tela)

Criado 7 de fevereiro de 2009
Respostas 0
Participantes 1