A técnica de migração recomendada é utilizar o tipo Importar com Ligação de Sessão sem Preservação de Estado do WebSphere Integration
Developer que permite chamar um EJB de sessão sem preservação de estado como um componente SCA. Durante a migração, o código Java customizado deve ser escrito para conversão entre o estilo de interface Java do SCA e o estilo de interface EJB existente.
Para criar o componente EJB customizado:
- No projeto de módulo, expanda Interfaces e selecione a interface WSDL que foi gerada para esse EJB no WebSphere Studio
Application Developer Integration.
- Arraste e solte essa interface sobre o Editor de Montagem. Um diálogo aparecerá solicitando que você selecione o tipo de componente que irá criar. Selecione Componente sem Tipo de Implementação e clique em OK.
- Um componente genérico aparecerá no diagrama de Montagem. Selecione-o e vá para a visualização Propriedades.
- Na guia Descrição, você pode alterar o nome e o nome de exibição do componente para algo mais descritivo. Escolha um nome como seu nome do EJB, mas anexe um sufixo, como “JavaMed”, porque ele será um componente Java que faz mediação entre a interface WSDL
gerada para o EJB no WebSphere Studio Application Developer Integration
e a interface Java do EJB.
- Na guia Detalhes você verá que esse componente tem uma interface - aquela que você arrastou e soltou sobre o Editor de Montagem.
- De volta ao Editor de Montagem, clique com o botão direito do mouse no componente que acabou de criar e selecione Em seguida, selecione o pacote no qual a implementação Java será gerada.
Isso cria um esqueleto do serviço Java que adere à interface WSDL de acordo com o modelo de programação SCA, no qual os tipos complexos são representados por um objeto que é um commonj.sdo.DataObject e os tipos simples são representados por equivalentes de seus Objetos Java.
Os seguintes exemplos de código mostram:
- Definições relevantes da interface WSDL 5.1.
- Os métodos WebSphere Studio Application Developer Integration Edition 5.1 Java que correspondem ao WSDL
- Os métodos WebSphere Integration Developer 6.0 Java para o mesmo WSDL
O seguinte código mostra as definições relevantes da interface WSDL 5.1:
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified"
elementFormDefault="unqualified"
targetNamespace="http://migr.practice.ibm.com/"
xmlns:xsd1="http://migr.practice.ibm.com/">
<complexType name="StockInfo">
<all>
<element name="index" type="int"/>
<element name="price" type="double"/>
<element name="symbol" nillable="true"
type="string"/>
</all>
</complexType>
</schema>
</types>
<message name="getStockInfoRequest">
<part name="symbol" type="xsd:string"/>
</message>
<message name="getStockInfoResponse">
<part name="result" type="xsd1:StockInfo"/>
</message>
<operation name="getStockInfo" parameterOrder="symbol">
<input message="tns:getStockInfoRequest"
name="getStockInfoRequest"/>
<output message="tns:getStockInfoResponse"
name="getStockInfoResponse"/>
</operation>
O seguinte código mostra os métodos WebSphere Studio Application Developer
Integration Edition 5.1 Java que correspondem ao WSDL:
public StockInfo getStockInfo(String symbol)
{
return new StockInfo();
}
public void setStockPrice(String symbol, float newPrice)
{
// definir algumas coisas
}
O seguinte código mostra os métodos do WebSphere Integration Developer 6.0 Java para o mesmo WSDL:
public DataObject getStockInfo(String aString) {
//TODO Precisa ser implementado.
return null;
}
public void setStockPrice(String symbol, Float newPrice) {
//TODO Precisa ser implementado.
}
Eventualmente, você precisa preencher o código real no qual vê as tags “//TODO” na classe de implementação Java gerada. Primeiro, é necessário criar uma referência a partir desse componente Java para o EJB real a fim de que ele possa acessar o EJB de acordo com o modelo de programação SCA:
- Mantenha o Editor de Montagem aberto e mude para a perspectiva J2EE. Localize o projeto EJB que contém o EJB para o qual você está criando um serviço.
- Expanda seu item Descritor de Implementação: <nome_do_projeto> e localize o EJB. Arraste-o e solte-o sobre o Editor de Montagem. Se for avisado sobre dependências do projeto que precisam ser atualizadas, selecione a caixa de opções Abrir o editor de dependência do módulo… e clique em OK.
- Na seção J2EE, certifique-se de que o projeto EJB esteja listado e, se não estiver, inclua-o clicando no botão Incluir….
- Salve as dependências do módulo e feche esse editor. Você verá que uma nova Importação foi criada no Editor de Montagem. Você pode selecioná-la e ir para a visualização Propriedades na guia Descrição para alterar o nome da importação e o nome de exibição para algo mais significativo. Na guia Ligação, você verá que o tipo de importação é automaticamente definido para Ligação de Bean de Sessão Sem Preservação de Estado e o nome JNDI do EJB já está definido adequadamente.
- Selecione a ferramenta de Ligação a partir da paleta no Editor de Montagem.
- Clique no componente Java e solte o mouse.
- Em seguida, clique em Importação EJB e solte o mouse.
- Quando for perguntado A referência correspondente será criada no nó de origem. Deseja continuar?, clique em OK.
Isso cria uma ligação entre os dois componentes.
- Selecione o componente Java no Editor de Montagem e a visualização Propriedades na guia Detalhes, expanda Referências e selecione a referência para o EJB que acabou de ser criado. Você pode atualizar o nome da referência se o nome gerado não for muito descritivo ou adequado. Lembre-se do nome dessa referência para uso futuro.
- Salve o diagrama de Montagem.
Você deve utilizar o modelo de programação SCA para chamar o EJB a partir da classe Java gerada.
Abra a classe Java gerada e siga estas etapas para escrever o código que chamará o serviço EJB. Para a classe de implementação Java gerada:
- Crie uma variável privada (cujo tipo é aquele de sua interface EJB remota):
private YourEJBInterface ejbService = null;
- Se houver tipos complexos na interface EJB, então, crie também uma variável privada para o BOFactory:
private BOFactory boFactory = (BOFactory)
ServiceManager.INSTANCE.locateService(“com/ibm/websphere/bo
/BOFactory”);
- No construtor da classe de implementação Java, utilize as APIs do SCA para resolver a referência EJB (lembre-se de preencher o nome da referência EJB que você escreveu há algumas etapas atrás) e defina a variável privada igual a essa referência:
// Localize o serviço EJB
this.ejbService = (YourEJBInterface)
ServiceManager.INSTANCE.locateService("name-of-your-ejb-reference");
Para cada “//TODO” na classe de implementação Java gerada:
- Converta todos os parâmetros nos tipos de parâmetros que o EJB espera.
- Chame o método adequado na referência EJB utilizando o modelo de programação SCA, enviando os parâmetros convertidos.
- Converta o valor de retorno do EJB no tipo de valor de retorno declarado pelo método de implementação Java gerado.
/**
* Método gerado para suportar o tipo de porta WSDL de implementação nomeada
* "interface.MyBean".
*/
public BusObjImpl getStockInfo(String aString) {
BusObjImpl boImpl = null;
try {
// chame o método EJB
StockInfo stockInfo = this.ejbService.getStockInfo(aString);
// formule o objeto de dados SCA a ser retornado.
boImpl = (BusObjImpl)
this.boFactory.createByClass(StockInfo.class);
// converta manualmente todos os dados do tipo de retorno EJB para o
// objeto de dados SCA a ser retornado
boImpl.setInt("index", stockInfo.getIndex());
boImpl.setString("symbol", stockInfo.getSymbol());
boImpl.setDouble("price", stockInfo.getPrice());
} catch (RemoteException e) {
e.printStackTrace();
}
return boImpl;
}
/**
* Método gerado para suportar o tipo de porta WSDL de implementação nomeada
* "interface.MyBean".
*/
public void setStockPrice(String symbol, Float newPrice) {
try {
this.ejbService.setStockPrice(symbol, newPrice.floatValue());
} catch (RemoteException e) {
e.printStackTrace();
}
}