cap.25_tirando o máximo do javaee6 open source (1)

download cap.25_tirando o máximo do javaee6 open source (1)

of 10

Transcript of cap.25_tirando o máximo do javaee6 open source (1)

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    1/10

    Introduo aos Web-Services via JAX-WS

    -Um breve histrico sobre Web-ServicesOOs Web-Services so uma tecnologia popular para apoiar iniciativas de B2B, SOA e computaodistribuda em geral, quando pensamos na Internet. Em sua forma mais clssica, baseada em protocolo

    SOAP/XML, prover ou consumir servios pode requerer um grande esforo quando implementadosmanualmente, sem o apoio de um framework e gerador especializados.

    Para amenizar este problema, desde o incio do sculo que no faltam frameworks e geradores para Web-Services. Produtos como o Apache Axis e inmeros outros produtos comerciais, porm, davam suasprprias sadas e modificaram o problema original para outro: falta de padro e at de compatibilidadeentre as diversas solues, que introduziam extenses proprietrias aos seus produtos.

    Felizmente, para problemas como este que o padro Java EE foi criado. A partir da verso 2.0 da APIJAX-WS, introduzida no Java EE 5, a simplicidade se concretizou (tanto quanto possvel). E estasimplicidade, aliada a um padro de mercado, tornaram o JAX-WS a melhor opo do mundo Java parase prover ou consumir servios Web via SOAP!

    - SOAP x RESTNo prximo captulo veremos uma soluo alternativa aos Web-Services "SOAP" abordados nestecaptulo, chamada RESTful Web-Services. Esta alternativa pode ser implementada tambm de formapadro, pela API JAX-RS - e tambm conta com frameworks de apoio produtividade. Na verdade, porser de fato mais simples de se utilizar, dispensando a camada SOAP sobre o protocolo HTTP, o XML eoutras exigncias de Web-Services tradicionais, os RESTful Web-Services j so inclusive mais popularesna Internet. H quem diga inclusive que eles iro sepultar os Web-Services, mas h tambm quemaponte vantagens nicas do padro JAX-WS.

    Possivelmente, neste momento e por algum tempo, o desenvolvedor ter que dominar ambos: muitosservios pblicos so expostos em somente uma destas modalidades e ainda h nicho significativo paraambos.

    Por este motivo, e como este assunto vasto, deixaremos esta polmica fora de nosso escopo,trabalhando com os dois padres. Do ponto de vista estritamente tcnico, o prprio desenvolvedorpoder tirar suas prprias concluses aps as prticas deste e do prximo captulo.

    Provendo um Servio

    -Entendendo a demanda de negcio do "provedor"Suponhamos que nosso sistema seja instalado em uma filial multinacional e que a matriz ou outras filiaisqueiram, diretamente de seus sistemas, recuperar dados de um funcionrio. Eles precisam de nome,sexo e data de nascimento, mas possuem o CPF em seu sistema (na falta de um campo mais "neutro"como uma matrcula global).

    Do ponto de vista tecnolgico, h tambm a preferncia por expor este servio na forma de um Web-Service tradicional, por questes culturais - os analistas j trabalham h alguns anos com isso e queremmanter o padro.

    Vamos ento implementar este servio no padro JAX-WS 2.0 e, o que ainda mais interessante, fora deum continer EJB! O padro JAX-WS opera de forma ainda mais transparente com o uso de um mtodode EJB, mas possvel utiliz-lo no Tomcat, por exemplo, atravs de utilitrios de gerao que veremos.

    Captulo

    25Provendo e ConsumindoWeb Services com JAX WS

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    2/10

    Importante: Podemos utilizar EJB 3.x no jCompany, sem problemas, utilizando o jBoss AS, porexemplo, mas como todo o tutorial do livro se baseou no Tomcat, manteremos esta linha.

    -Criando a classe de servioO primeiro passo para a criao de um WS*

    Vamos implementar a nossa classe de servio na camada de controle, uma vez que no utilizaremosnenhuma lgica de negcios e acesso a banco de dados. Tomamos a iniciativa de simplificar o exemplopara que o foco fique exclusivamente na criao do WS. As classes podem ser vistas na

    a definio de uma classe que ser exposta como serviona Web. No nosso exemplo, teremos uma classe "BuscaFuncionarioWS" em que seu mtodo expostorecebe uma String "CPF" e retorna uma entidade "Funcionario".

    Figura G25.1 enaFigura G25.2.

    Importante: No se esquea que os objetos a serem transmitidos pelo WS devem ser serializveis!

    Figura G25.1. Classe "Funcionario".

    Figura G25.2. Classe de servio "BuscaFuncionarioWS".

    #1. Anotao "@WebService" indica que a classe "BuscaFuncionarioWS" um servio web (WS).#2. Anotao "@WebMethod" indica que esse mtodo ser exposto no WS.#3. Anotao "@WebParam" serve para informar o nome do parmetro do WS.#4. Nesse ponto, pedimos a nossa fachada para recuperar o funcionrio baseado no nosso CPF.

    No vamos entrar em detalhe na implementao da camada de modelo para no fugir donosso foco principal.

    *Nesta documentao iremos utilizar a sigla WS para indicar Web-Service.

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    3/10

    Captulo G22

    -Configurando dependncias no projeto para gerao dos artefatos de suporte a Web-Services JAX-WS (somente Tomcat)

    1. Adicione as dependncias do JAX-WS no arquivo "pom.xml" do projeto onde ser implementado oWS.

    Figura G25.3. Configurando o arquivo "pom.xml" com as dependncias do JAX-WS.

    2. Adicione o plugin para gerao dos Stubs em tempo de empacotamento. A documentao detalhadado plugin se encontra em:https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/. Vamosadicionar configuraes de profile no arquivo "pom.xml".

    Figura G25.4. Adicionando profile do maven no arquivo "pom.xml".

    https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/
  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    4/10

    #1. Esta URL indica para o arquivo "pom.xml" o uso da classe de servio do WS.-Configurando o JAX-WS.

    Para configurar o JAX-WS, vamos seguir os passos abaixo:

    1. Crie o arquivo "sun-jaxws.xml" dentro da pasta WEB-INF do projeto, informando os WEB-SERVICEScriados.

    Figura G25.5. Arquivo "sun-jaxws.xml" com as configuraes do WS criado.

    2. Mapeie a aplicao para responder ao servio. Essa configurao dever ser feita no arquivo"web.xml".

    Figura G25.6. Mapeando o servio no arquivo web.xml.

    -Ativando a execuo de deploy-completo e testando.OjCompanydeve ser configurado com uma tarefa de deploy especfica para WS, para isso devemosimplantar a demanda abaixo:

    1. Acione o menu Run -> External Tools -> External Tools Configurations....2. Selecione qual tipo de Deploy voc vai utilizar e adicione mais o parmetro "-Dwebservice=S" no

    campo "Arguments" e libere a aplicao.

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    5/10

    Captulo G22

    Figura G25.7. Adicionando parmetro do WS na Liberao para Tomcat Completa Desenvolvimento.

    3. Verifique a disponibilidade do servio pelo browser atravs daURL:http://localhost:8080/rhtutorial/busca.O servio pode ser visto naFigura G25.8.

    Figura G25.8. Tela identificando que o servio est ativo.

    Consumindo um Servio

    -Entendendo o lado do "consumidor"Como no traz nenhuma restrio proprietria, o servio que criamos no passo anterior est disponvelpara ser consumido por qualquer "cliente" de WS, que pode utilizar qualquer tecnologia para acess-lo.

    Mas como nossa tecnologia Java, precisamos fechar o nosso ciclo para tambm entender quais so ospadres JAX-WS para o lado "consumidor".

    Como teste, e para evitar a proliferao de aplicaes, vamos definir nossa classe consumidora nomesmo projeto "rhtutorial". Fica sob responsabilidade do desenvolvedor test-la em outra aplicao, sedesejado.

    -Configurando dependncias no projeto para gerao dos artefatos de suporte ao JAX-WS (somenteTomcat)Para estabelecer o servio de consumo, ns devemos seguir a demanda abaixo para configurar o JAX-WScomo uma dependncia da classe provedora*

    1. Adicione o plugin para gerao dos Stubs em tempo de empacotamento. A documentao detalhadado plugin se encontra em:

    .

    https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/. Vamosadicionar configuraes de profile no arquivo "pom.xml"

    *Por motivos didticos, neste livro a classe provedora e consumidora pertencem ao mesmo projeto. No mundo real isso muito

    dificilmente ir acontecer, uma vez que o objetivo de uso dos WS a transmisso de dados entre aplicaes. No contexto de aplicaesdiferentes para o uso do WS a classe consumidora precisaria tambm das dependncias do jCompany Service em seu arquivo"pom.xml".

    http://localhost:8080/rhtutorial/buscahttp://localhost:8080/rhtutorial/buscahttp://localhost:8080/rhtutorial/buscahttps://jax-ws-commons.dev.java.net/jaxws-maven-plugin/https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/http://localhost:8080/rhtutorial/busca
  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    6/10

    2. Adicione ao arquivo "pom.xml" os parmetros de profile e dependncias mostrados naFigura G25.9.

    Figura G25.9. Adicionando profile do maven no arquivo "pom.xml".

    #1. Este trecho no tem muitas novidades quanto ao descrito anteriormente, a diferena a tag"goals" que neste caso indica que os artefatos importados pertencem classe provedora.

    3. Execute o comando maven "install" com o parmetro "-Dwebservice=S" para gerar os artefatos. Sepreferir execute o script de deploy que configuramos na Figura G25.7. Aps rodar o script, serogerados os artefatos para consumo com os mesmos pacotes da aplicao do servio. Veja FiguraG25.10.

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    7/10

    Captulo G22

    Figura G25.10. Artefatos gerados no consumidor do WS.

    Importante: Lembrando que para gerao dos artefatos no consumidor, ao executar o script de deploy,a aplicao provedora do servio deve estar executando.

    -Criando a classe de consumoVamos criar um formulrio para entrada dos dados, no nosso caso o CPF e uma classe de controle querecebe esse parmetro da tela e retorna o funcionrio. Para o exemplo vamos utilizar o padro "controlesimples", que um padro que dispensa diversos itens de arquitetura da camada viso e controle.

    1. Crie a classe de controle conforme Figura G25.11.

    Figura G25.11. Classe de controle para consumir o servio.

    2. Crie o arquivo "buscafuncionarioCtl.xhtml" dentro da pasta ".../WEB-INF/fcls/buscafuncionario/".Esse arquivo ser utilizado para entrada e exibio dos dados.

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    8/10

    Figura G25.12. Arquivo xhtml para entrada e exibio dos dados da classe de controle para consumir o servio.

    #1. Tag que cria o campo para o usurio informar o "CPF".#2. Lgica para mostrar o retorno da pesquisa. Se o funcionrio for retornado, seus dados so

    mostrados, caso contrrio a mensagem "Funcionrio no encontrado!" exibida.

    3. Crie o arquivo "package-info.java" da classe de consumo informando o caminho para o XHTML deconfigurao da tela. AFigura G25.1 mostra o arquivo pronto.

    Figura G25.13. Arquivo "package-info.java" com configuraes para utilizao de um caso de uso "ControleSimples".

    4. Crie um menu para acessar o nossa classe provedora. Para isso adicione o cdigo da Figura G25.14no arquivo "geralMenu.xhtml" da aplicao.

    Figura G25.14. Adicionando um item de menu.

    -Testando o novo servio de consumoNeste ponto, nossa aplicao estar pronta para fornecer e consumir o servio estabelecidoanteriormente. D um "Liberao Para Tomcat Completa Desenvolvimento", acione o tomcat e teste oservio gerado pelo WS.

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    9/10

    Captulo G22

    Figura G25.15. Tela com o acesso ao servio de busca de funcionrio por CPF.

  • 7/22/2019 cap.25_tirando o mximo do javaee6 open source (1)

    10/10

    Sumrio

    Neste captulo discutimos brevemente sobre Web-Services tradicionais, baseados em SOAP sob oprotocolo HTTP e uso de XML/WSDL.

    Criamos um primeiro servio para recuperar os dados principais de um funcionrio a partir de seu CPF.Em seguida, implementamos um exemplo do lado "consumidor", utilizando em ambos os casos o padroJAX-WS sobre o Tomcat.

    No prximo captulo, iremos explorar a alternativa RESTful Web-Services, baseada no padro JAX-RS,para viabilizar uma comparao entre os dois modelos, alm de conhecer generalidades do jCompanynesta rea, atravs do jCompany Service.