Quero neste Post demonstrar a vocês como podemos usar o componente For Each do OSB para fazer uma iteração em uma lista de empregados que serão retornados de um serviço exposto do BPEL
Alem de usar o componente For Each mostrarei também como podemos fazer a mesma iteração usando Xquery
Fiz um serviço no BPEL que retorna uma lista de Empregados que são retornados do meu banco de dados do Oracle XE.
Como a idéia deste Post é apenas demonstrar como usar o componente For Each irei diretamente para nosso foco e caso você tenha alguma duvida de como Expor um Serviço ou usar um Service Callout consulte os links abaixo:
Precisei então apenas expor o meu serviço criado no BPEL usando um Business Service e agora irei chamar este serviço usando o Service Callout, para isso criei um Proxy Service chamado ForEachProxyService.proxy
Um detalhe muito importante que você precisa estar atento é na construção do seu Contrato (WSDL), clique aqui e faça o Download do meu WSDL para que você veja como ficou a definição deste contrato.
Abaixo veja que criei a Variável obterDadosEmpregadosRequest para montar nosso Request e a Variável obterDadosEmpregadosResponse que guardará a resposta da chamada deste nosso serviço SelectEmployeeBusiness que é o serviço que precisei expor no OSB:
Como minha intenção é apenas devolver esta Lista de Empregados que será retornado do nosso serviço serviço SelectEmployeeBusiness vamos adicionar diretamente no Response Pipeline um Stage e dentro deste Stage o componente For Each e também um Replace dentro do nosso For Each
Veja abaixo em detalhes como ficará as propriedade do nosso For Each
Clique então na caixinha do nosso For Each e na guia Properties preencha conforme abaixo:
- For Each Variable: empregado (Esta é apenas um nome que daremos para nossa iteração, ou seja, o que iterarmos será retornado nesta variável)
- Xpath: <XPath> (Aqui por enquanto pode deixar como está)
- In Variable: obterDadosEmpregadosResponse (Este é o nome da nossa variável de retorno do nosso serviço que adicionei em nosso Service Callout, usaremos esta variável para que possamos iterar em cima da lista que será retornada)
Clique então agora sobre a tag <XPath>
Na caixa abaixo, arraste para o lado esquerdo nossa listaEmpregados que estará abaixo de nosso obterDadoEmpregadosResponse
Aqui não precisamos de nosso for:obterDadosEmpregadosResponse pois não precisamos que esta tag também seja retornada em nosso Response, por isso podemos excluir esta parte e deixar apenas ./listaEmpregados
Então nosso For Each ficará assim:
Agora clique em nosso Replace e na guia Properties deixe conforme abaixo:
- XPath: . (Ponto)
- In Variable: body (Faremos o Replace do nosso body)
- Expression: <Expression> (Aqui por enquanto pode deixar como está)
- Replace node contents (Marque esta opção)
Clique agora sobre <Expression> e monte seu payload de Response conforme abaixo:
Obs: Duvidas como montar o Response ? Veja meu post Usando o Service Callout do OSB
Agora dentro da tag <listaEmpregados> acrescente nossa variável do For Each ($empregado), apenas colocaremos ela aqui entre chaves e após a variável colocaremos uma barra e um asterisco (/*) pois queremos que retorne tudo após esta variável que na verdade retornará tudo dentro da lista, como já iniciamos a tag <listaEmpregados> ela não precisa ser retornada e por isso colocamos o /*
Clique em OK e teste o serviço:
Agora caso você não queira usar o componente For Each, podemos dentro do nosso Replace na mesma tela acima colocarmos em Xquery conforme abaixo:
Obs: Lembrando que caso você prefira usar a Xquery, o nosso Replace não poderá estar dentro do componente For Each pois ele não deverá existir neste caso.
Chamando o nosso Serviço ForEachProxyService veja abaixo nosso retorno:
Veja que agora temos vários <empregados> dentro de nossa <listaEmpregados>
Duvidas ? Deixe seu comentário e faça download do Projeto BPEL e deste Projeto OSB
Abraços e até a Próxima
/:-D