Capturar erros em webservices de Fórmulas Visuais.

Ao criar datasets é comum que gerem erros, pois podem acontecer situações de gerar exceções como por exemplo falhas de comunicação com o webservice, autenticação, entre outros.

Quando há a comunicação com fórmulas visuais o erro pode ser customizado, que é no momento onde geramos uma atividade de excessão.

Após diversos testes identifiquei que o código abaixo retorna a estrutura da Tag DataSetXML

   var result = authService.execute(codcoligada, idformulavisual, contexto, '',  xml, '');    		

Quando gera-se uma exceção em fórmula visual o conteúdo da mensagem é explícito na tag ErrorMessage

Para entender o funcionamento foi feita a seguinte análise, veja o código abaixo.

 

var servico = ServiceManager.getServiceInstance(NOME_SERVICO);
		            var serviceHelper = servico.getBean();
		            var instancia = servico.instantiate(CAMINHO_SERVICO);
		            var ws = instancia.getRMIwsFormulaVisual();
		            var instanciaError = instancia.getRMIwsFormulaVisual();
		            
		            
		            var authService = serviceHelper.getBasicAuthenticatedClient(ws, "com.totvs.IwsFormulaVisual", 'mestre', 'senha');
		            
		            var xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tot="http://www.totvs.com/"> ' +
		            '<soapenv:Header/> ' +
		            '<soapenv:Body> ' +
		            '   <tot:Execute> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:codColigada>1</tot:codColigada> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:idFormula>9</tot:idFormula> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:context>codusuario="mestre";codcoligada=1</tot:context> ' +
		            '   </tot:Execute> ' +
		           ' </soapenv:Body>' +
		         ' </soapenv:Envelope> ' ;
		            
		            
		            
		            var contexto = 'CODCOILIGADA=1;CODFILIAL=1;CODUSUARIO=Usuario;CODSISTEMA=G';
		            var result = authService.execute(codcoligada, idformulavisual, contexto, '',  xml, '');    	

Instanciamos uma variável chamada authService, nesta variável definimos qual objeto iremos acessar, neste caso é o ‘com.totvs.IwsFormulaVisual’.

 var authService = serviceHelper.getBasicAuthenticatedClient(ws, "com.totvs.IwsFormulaVisual", 'mestre', 'senha');

Após isso, foi observado dentro do Eclipse todos os métodos que compõem esta Interface.

Logo em seguida chamamos o método result = authService.execute , este método retorna um objeto do tipo ConWSFormulaVisualResult .

Ao analisar a classe ConWSFormulaVisualResult verifiquei que existe um método do tipo getErrorType() e getErrorMessage() , ambas retornam objeto do tipo java.xml.bind.JAXBElement<String>

Por fim, em um contexto que a fórmula visual gera uma exceção, podemos perceber os valores destas duas tags abaixo: 

O método getValue é o gerado pela classe JAXBElement, que pode ser visto neste link.

log.info('getErrorMessage() ' + result.getErrorMessage().getValue());
//Gera o resultado 
//ERRO - Fórmula Visual: 'TESTE FORMULA VISUAL'.



log.info('getErrorMessage() ' + result.getErrorType().getValue());
//RM.Lib.Workflow.RMSWorkflowException




Referências

https://docs.oracle.com/javaee/7/api/javax/xml/bind/JAXBElement.html