Não utilize XMLObject para apresentação no Oracle BPM!

Quem trabalha com Web Services no Oracle BPM sabe que é inevitável fugir do XMLObject. E por quê é inevitável? Simplesmente porque toda vez que algum serviço é catalogado, tanto o seu request quanto o seu response são catalogados como um objeto desse tipo, que nada mais é que do que a representação XML de um tipo complexo, ou seja, um XML Schema (XSD).

Na parte de apresentação no BPM existem duas opções: presentations e JSP. Em ambos os casos é necessário sempre utilizar um BPM Object para fazer a representação dos dados. Um BPM Object é puramente um objeto e com isso contém atributos e métodos específicos.

No meu caso, tenho trabalhado com JSP para a camada de visualização, já que preciso ir um pouco além do que simplesmente exibir dados. As telas do meu processo precisam um alto nível de customização e também possuem bastantes regras de validação e fluxo no lado do cliente usando Java Script. É também comum no meu processo a utilização de serviços externos, e com isso se faz por necessário apresentar os dados retornados por esses serviços nas minhas páginas JSP. Conforme dito anteriormente, para mostrar esses dados preciso de um BPM Object e para não criar um BPM Object redudante, ou seja, um BPM Object com a estrutura idêntica do XML Object – que já está cadastrado no meu projeto – o que eu fiz foi criar um atributo nesse BPM Object que encapsula um XML Object, dessa forma poderia usar os atributos do XML Object como atributos dentro do meu BPM Object. Algo como um atributo do tipo de uma lista genérica em um objeto java.

Mas qual foi a minha surpresa ao iterar sobre esse atributo do tipo XML Object no meu JSP? Simplesmente não funciona, ou melhor, funciona pela metade! hehe .. deixa eu explicar.

Se eu tenho um BPM Object com a seguinte estrutura:

 Text |  copiar código |? 
1
MyBPMObject
2
- name (string)
3
- email (string)
4
- address (XMLObject)
5
 
6
Address (XMLObject)
7
- zipcode (int)
8
- city (string)
9
- state (string)

E no JSP tentar acessar o atributo da seguinte forma:

 HTML |  copiar código |? 
1
Nome: <c:out value="${bpmObject.name}"/>
2
<br/>
3
Estado: <c:out value="${bpmObject.address.state}"/>

Funciona!

Agora, se o meu XMLObject fosse do tipo array, ou seja, uma lista, não funciona! Vejamos o meu BPMObject alterado para suportar uma lista de endereços (address):

 Text |  copiar código |? 
1
2
MyBPMObject
3
- name (string)
4
- email (string)
5
- address[] (XMLObject)
6

No JSP:

 HTML |  copiar código |? 
1
2
Nome: <c:out value="${bpmObject.name}"/>
3
<br/>
4
Estado: <c:out value="${bpmObject.address[0].state}"/>
5

O exemplo acima não funciona, é como se o atributo “address” não existisse! Bizarro! Tentei inclusive usando a própria taglib do BPM e nada!

O que eu tive que fazer? Tcharammm.. criar um BPM Object idêntico ao meu XMLObject e criar um método dentro desse BPM Object que recebe como parâmetro um XML Object, o que ele faz é mapear os valores desse XML Object para os seus próprios atributos… totalmente POG! Mas foi o jeito…

Se alguém souber de algum “pulo do gato”, por favor me informe que eu publico aqui, mas eu sinceramente acho difícil ter alguma mágica, por mais óbvio que seja, não funciona. O mais bizarro ainda, é que se no Screenflow que antecede o JSP eu der um output do objeto da mesma forma que eu estou dando no JSP, funciona, só não funciona mesmo no JSP :(

Fica a dica: não usem XML Object para apresentar dados!

BPM

Se você gostou desse tópico, por favor considere deixar um comentário ou se inscreva no feed e tenha no futuro todos os tópicos entregues diretamente no seu agregador.

Deixe seu Comentário

(obrigatório)

(obrigatório)