Integração CRM Retails

10 respostas
novellietibr

Pessoal, estou precisando de uma ajuda urgente.

Estou trabalhando em um projeto de integração via webservice com o CRM Retails. Me forneceram o wsdl e, através do Axis2 gerei as classes do lado server do webservice (Stub, CallbackHandler e FaultMessag).

Estou tentando gerar os xml’s com base nos wsdl fornecidos, populando-os através da consulta em banco de dados via JPA/hibernate.

O problema é o seguinte: os WSDL’s fornecidos para mim correspondem a processos e não necessariamente a tabelas de bancos de dados. Algo mais ou menos assim:

ClasseDoProcessoStub.java >> ClasseStatic.java >> factoryStatic >> atributos com tipos implementados com base nos tipos padrões do java… e assim por diante.

O que não estou conseguindo é popular com dados esses objetos.

Minha camada de persistência está assim: Entidade >> entidadeDao (que estende de uma interface DAO) >> Service (classe onde crio e populo o objeto da entidade com dados da consulta ao banco) . Nessa classe Service também é onde tento jogar a lista de objetos da entity em uma lista do objeto stub.

Enfim… nada do que fiz até o momento conseguiu surtir o efeito desejado que é popular o stub com os dados do database.

Alguém já fez essa integração com o CRM Retails?

Alguma luz de como proceder?

Não sei se consegui explicar bem a situação, pois é bastante complexa, mas qualquer dica será muito bem vinda.

Obrigado.

10 Respostas

darlan_machado

Deixa eu entender melhor, você vai fazer a persistência, isso?
Se for, realmente, você precisa filtrar as informações que recebe (e que estão no contrato) e, então, jogar para as entities, então, persistir.

novellietibr

@darlan_machado Obrigado pela resposta.
Na verdade é o contrário que quero fazer: pegar os dados do banco e gerar o xml de acordo com o contrato.

O que tá pegando é a complexidade do contrato… vou tentar explicar aqui:

  • para o processo “bloqueioVeiculos” tenho um wsdl correspondente;
  • para esse processo também tenho as classes ‘BloqueioVeiculosStub.java’, ‘BloqueioVeiculoCallBackHandler.java’ e ‘FaultMessage.java’;

O processo normal seria jogar os dados retornados de uma query para dentro de métodos set… que estariam na classe stub ou algo próximo disso, correto?

Porém essa classe stub representa um processo e dentro dela existem mais 234 classes estáticas com suas respectivas factories - foi gerado pelo Axis2.

Para pegar o chassi do carro, por exemplo, lá no banco e jogar para a stub, existe uma propriedade privada do tipo VinType que nada mais é que uma outra classe estática que tem um outro atributo privado do tipo String padrão do java.

Essa tem sido minha dificuldade.

O que acabei de conseguir fazer no momento foi o seguinte:

@SuppressWarnings(null)

public BloqueioVeiculoService() throws AxisFault {

BloqueioVeiculoDAO dao = new BloqueioVeiculoDAO();

List itens = dao.listAll();
//BlockVehicleServiceStub stub = new BlockVehicleServiceStub();
	VINType vin = new VINType();
			
	for (BloqueioVeiculo a : itens) {
		vin.setVINType(a.getVin());
		
		System.out.println("obj a: " + a.getVin());
		System.out.println(" - obj stub: " + vin.getVINType());
		
	}

Somente acessando as classes estaticas do Stub consegui atribuir o valor para o (futuro) xml.

Porém, esse vai ser um trabalho bastante penoso…

Caso alguém tenha uma forma mais simples de se fazer isso… agradeço por qualquer dica.

darlan_machado

Mas independe qual seja a ordem dos fatores, se quer receber e persistir ou ler do banco e enviar para o serviço, você precisa converter as informações, respeitando os namespaces respectivos.
Realmente, não é o mais animador dos cenários, mas…

novellietibr

Tem razão. A conversão das informações sempre terá de ser feita.

Mas este cenário, em específico, está bastante complexo. Achei que usando o Axis2, tudo ficaria mais simples.

darlan_machado

Acho que vai ser a mesma coisa.
Você precia mapear o que tem no banco e o que terá de enviar, fazendo o de - para.
Isso é extremamente comum no meu trabalho e posso te garantir que você ficaria aterrorizado com tamanha complexidade nos wsdls e xsds.

novellietibr

Imagino @darlan_machado. Obrigado pela ajuda.

Eu consegui algum progresso aqui entre ontem e hoje.

Bom saber que trabalhas com o Axis2. Permita me tirar uma dúvida com você: estou enroscado em algumas conversões de dados…

como você faz a conversão de um valor do tipo int para atribuir a um método do tipo NonNegativeInteger do Axis2 ?

Tenho o seguinte código:

CancelamentoPedidoDAO dao = new CancelamentoPedidoDAO();
List<CancelamentoPedido> itens = dao.listAll();

PurchaseOrderIdentityType purchaseOrderCode = new PurchaseOrderIdentityType();

for (CancelamentoPedido a : itens) {
		/* Atribui os valores do BD aos atributos da classe stub */
		divisionCode = new DivisionCodeType(a.getDivisionCode(),false);
		dealerCode.setDealerCodeType(a.getDealerCode());
		purchaseOrderCode.setPurchaseOrderCode(a.getPurchaseOrderCode());
}

O eclipse me aponta o seguinte erro encima do
setPurchaseOrderCode(a.getPurchaseOrderCode():

The method setPurchaseOrderCode(NonNegativeInteger) in the type 
PurchaseOrderIdentityType is not applicable for the arguments (int)

Já li a documentação do Axis2 sobre essa classe NonNegativeInteger e tentei converter o int em outro tipo para usar um dos métodos da classe, mas não obtive sucesso ainda.

Alguma dica?

darlan_machado

Na verdade, eu não trabalho com axis2, eu trabalho com SOA e tudo é feito sobre o protocolo SOAP, assim sendo, temos milhares de serviços expostos e precisamos transformar zilhões de coisas.
Para ter uma ideia, apenas em nosso service bus, temos três camadas distintas, cada qual com seu contrato, sem contar o contrato dos serviços consumidos.
Sobre a questão da transformação, eu dei uma olhada no javadoc da classe e como eu esperava, não tem muitos detalhes (a Apache é bem tosca nessa parte de documentação).

novellietibr

Fala @darlan_machado.

Na verdade, eu não trabalho com axis2, eu trabalho com SOA e tudo é feito sobre o protocolo SOAP, assim sendo, temos milhares de serviços expostos e precisamos transformar zilhões de coisas.

Nossa! Realmente é complexo essa questão de transformação/conversão de dados. Estou apanhando pra caramba aqui… rsrsrs… mas faz parte, uma vez que estou um tanto enferrujado com programação.

Sobre a questão da transformação, eu dei uma olhada no javadoc da classe e como eu esperava, não tem muitos detalhes (a Apache é bem tosca nessa parte de documentação).

Realmente a Apache deixa a desejar com relação a documentação, infelizmente.

darlan_machado

Então, especificamente sobre o NonNegativeInteger, ele estende de BigInteger.
A linha abaixo mostra como transformar um Integer em BigInteger

BigInteger bi = BigInteger.valueOf(myInteger.intValue());

Logo, com o NonNegativeInteger, deveria funcionar igual

NonNegativeIntegerbi = NonNegativeInteger.valueOf(myInteger.intValue());

Tenta aí.

novellietibr

Obrigado @darlan_machado

Esse exemplo foi de grande ajuda.

Criado 1 de fevereiro de 2018
Ultima resposta 8 de fev. de 2018
Respostas 10
Participantes 2