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)