www.devmedia.com.br
[versoparaimpresso]
Linkoriginal:http://www.devmedia.com.br/articles/viewcomp.asp?comp=33273
Fiquepordentro
Esteartigotilpordemonstrar,passoapasso,comodesenvolverumservioRESTfulcomas
operaesdeumCRUDparaumcadastrodeclientestotalmentewebatravsdeumprojetoJavaEE
comMaven.Paraquevocpossacompreendereaprendercomoutilizlas,esteprojetoirenvolver
umagamadetecnologiasdaplataformaJavacomoobjetivodecriarumasoluodequalidadee
escalvel.
Paraisso,serapresentadaaconstruodeumDERparaobancodedadosMySQLseguidopelo
desenvolvimentodeumservioRESTutilizandooJersey,implementaoderefernciada
especificaoJAXRS.
Almdisso,serutilizadaaespecificaoJPAeoHibernatecomoferramentaORMparafazero
mapeamentoobjetorelacionalentreastabelasdobancodedadoseasclassesJava.
Aofinal,vocsabercomoimplementarseusprimeirosserviosweb,recursocadavezmaiscomum
nomercadodesoftware,quebuscasoluescapazesdeproverdiferentesinterfacescomousurioe
defcilintegrao.
DurantemuitotempooswebservicesbaseadosemSOAPforampraticamenteanicasoluoparaa
comunicaoeimplementaodesistemasdistribudos.
Devidoaissoevisandoaqualidadedosservios,essaopopassouporvriasmelhoriasaolongodos
anos,principalmenterelacionadassegurana.
Noentanto,oswebservicesSOAPacabaramficandocomplexos,dedifcilimplementaoecomcustos
elevadosdeadoo.Apartirdeento,aopoporessetipodewebservicepassouaserinvivelem
algunscenrios,sejapelocusto,porrecursosdehardwareedesoftwareoumesmopelograndeconsumo
debandadarede,principalmenteporpartedosdispositivosmveis,queaindanotmumaconexode
altavelocidadeapreosacessveis.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 1/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
OprotocoloSOAPnecessitadeumasriedeparmetroseconfiguraesnoformatoXMLparaviabilizara
trocadedadosentreclienteeservidoreissotornaasmensagenslongastantoparatrfegonarede
quantoparaodispositivoclienteprocessararesposta.
Ousodewebservicessurgedanecessidadedeseterumaaplicaodistribudaeescalvel,necessidade
estaqueseespalhapelosmaisdiversossetoresdenegcioportodoomundo,sejaparaintegrar
sistemasemdiferentesplataformas,comoosdispositivosmveis,sejaparaconectarsistemasweba
sistemaslegados,exporumcanaldecomunicaoparaclientesouparceiros,dentreoutras
necessidades.
Nestecenrio,comointuitodefacilitaracomunicaoentresistemas,podemosfazerusodoprotocolo
HTTPeusufruirdopadroarquiteturalRESTparaimplementarosserviosweb,simplificandoassima
trocadedadosentreclienteeservidor.
Comoumgrandediferencial,oRESTsuportaosprincipaisformatosparacomunicaoetrocade
informaes(JSONeXML),popularmenteutilizadosnodesenvolvimentodesistemasdistribudoseem
outrasaplicaes.
Conhecidoporserumestilohbridoderivadodevriosestilosarquiteturaisbaseadosemrede,oREST
temcomoidealizaoepilaraimplementaodeservioswebbaseadosnoprotocoloHTTP.Otermo
surgiunosanos2000,nadissertaodocoautordoprotocoloHTTP,Dr.RoyThomasFielding,para
obtenodottulodePhD,comadissertaoArchitecturalStylesandtheDesignofNetworkbased
SoftwareArchitectures.
NesteartigoiremosdesenvolverumservioRESTfulresponsvelporviabilizarumcadastrodeclientes
comtodasasfuncionalidadesdeumCRUD.Odesenvolvimentodessecadastroconsistena
implementaodeumwebserviceparaqueumclientepossaconsumirerealizarasoperaesbsicas
deacessoaobancodedados.
AoexecutarestaIDEpelaprimeiravezsolicitadoaousurioqueinformeumdiretrioparaservircomo
ambientedetrabalho.OworkspacenadamaisdoqueumapastaadotadapeloEclipseparasalvaros
projetosqueeleestgerenciando.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 2/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura1.SelecionandoowizardMavenProject.
Naprximatela,decriaodoprojetoMaven,deixemarcadaaopoUsedefaultworkspacelocation
paraquesejautilizadooworkspaceconfiguradoaoexecutaroEclipsepelaprimeiravez.Emseguida,
cliquemaisumavezemNext(videFigura2).
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 3/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura2.Setandooworkspaceparaoprojeto.
Agora,conformeapresentadonaFigura3,deveserselecionadooArchetypedoMavenaserutilizado
paracriaroprojeto.Nestecaso,selecioneaopomavenarchtypewebapp,poisiremoscriarumprojeto
JavaEE.
OArchetypeumaespciedetemplatequeviabilizaacriaodeprojetoscombaseemumatecnologia
ouespecificao,comoJSF,JPA,Spring,Struts,dentreoutras.Feitoisso,cliqueemNext.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 4/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura3.SelecionandooArchetypedoMavenparaoprojetocadastrodeclientes.
Altimateladowizard,apresentadanaFigura4,mostraalgunscamposquedevemserpreenchidos
parafinalizaracriaodoprojeto.Nela,deveserinformadoogroupid(geralmenteinformaseositeda
organizao),oiddoartefato(identificadordoprojeto),aversodesteeonomecompletodopacote
base.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 5/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura4.Definiodosdadosparaidentificaodoprojeto.
ApsclicaremFinish,emalgumasocasiespodeocorrerumerrodeacessopastadorepositriolocal
doMaven,informandoquenofoipossveldefiniresserepositrio.Parasolucionlovocdevedeletara
pastarepositoryparaqueoEclipsepossacrilanovamentecomaspermissesdeacessocorretas.
OlocaldorepositriopodeserverificadonaopoLocalRepository,conformeapresentadonaFigura5,
nasprefernciasdoEclipse.
OrepositrionadamaisqueumapastanamquinalocalondeoMavenirbaixardeseuservidorou
servidorpersonalizadotodasasdependnciasdoprojeto,comoframeworks,pluginsebibliotecas.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 6/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura5.Definindoanovapastarepository.
Feitoisso,oMavenseresponsabilizarporbaixlasegerencilasapartirdeento.NaListagem1
apresentadoocdigodoarquivopom.xmldonossoprojeto.
Listagem1.Arquivopom.xmlcomasdependnciasdoprojeto.
01<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
02xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/mavenv4_0_0.xsd">
03<modelVersion>4.0.0</modelVersion>
04<groupId>br.com.devmedia</groupId>
05<artifactId>crud_cadastro_cliente</artifactId>
06<packaging>war</packaging>
07<version>0.0.1SNAPSHOT</version>
08<name>crud_cadastro_clienteMavenWebapp</name>
09<url>http://maven.apache.org</url>
10<dependencies>
11<dependency>
12<groupId>junit</groupId>
13<artifactId>junit</artifactId>
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 7/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
14<version>3.8.1</version>
15<scope>test</scope>
16</dependency>
17<dependency>
18<groupId>com.sun.jersey</groupId>
19<artifactId>jerseyserver</artifactId>
20<version>1.8</version>
21</dependency>
22<dependency>
23<groupId>com.sun.jersey</groupId>
24<artifactId>jerseyjson</artifactId>
25<version>1.8</version>
26</dependency>
27<dependency>
28<groupId>org.hibernate</groupId>
29<artifactId>hibernatevalidator</artifactId>
30<version>4.2.0.Final</version>
31</dependency>
32<dependency>
33<groupId>org.hibernate.common</groupId>
34<artifactId>hibernatecommonsannotations</artifactId>
35<version>4.0.1.Final</version>
36<classifier>tests</classifier>
37</dependency>
38<dependency>
39<groupId>org.hibernate.javax.persistence</groupId>
40<artifactId>hibernatejpa2.0api</artifactId>
41<version>1.0.1.Final</version>
42</dependency>
43<dependency>
44<groupId>org.hibernate</groupId>
45<artifactId>hibernateentitymanager</artifactId>
46<version>4.0.1.Final</version>
47</dependency>
48<dependency>
49<groupId>mysql</groupId>
50<artifactId>mysqlconnectorjava</artifactId>
51<version>5.1.6</version>
52<scope>compile</scope>
53</dependency>
54</dependencies>
55<build>
56<finalName>crud_cadastro_cliente</finalName>
57<plugins>
58<plugin>
59<groupId>org.apache.tomcat.maven</groupId>
60<artifactId>tomcat7mavenplugin</artifactId>
61<version>2.0</version>
62<configuration>
63<path>/</path>
64<port>8080</port>
65</configuration>
66</plugin>
67</plugins>
68</build>
69</project>
Vejamosaseguiralgumasconsideraessobrealistagem:
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 8/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Linhas4a8:NestetrechosodefinidasalgumasinformaesreferentesaoprojetoparaqueoMaven
possarealizarocontroledociclodevidadodesenvolvimento.Assimsendo,informadooidentificador
dogrupo,oidentificadordoartefato,aversoeonomedoprojeto
Linhas11a16:AquifoiinseridaumadependnciaaoJUnitparatestesdeunidadenoprojeto.OMaven
defineamesmaautomaticamentenoatodacriaodoprojeto
Linhas17a21:NesteblococonstaadependnciaaoservidorJersey,frameworkresponsvelpor
tratarasrequisiesrealizadasaoservio.SeucdigoassumeopapeldeServletContainerparareceber
etratartodasasrequisiesrealizadasviaprotocoloHTTP.Nesteprojetoiremosimplementaras
requisiesHTTPcomosverbosGET,POST,PUTeDELETEparaasrespectivasoperaesdeumCRUD.
AssimserpossvelinserirerealizaramanutenodosdadosnobancoMySQL
Linhas22a26:Nesteblocodefinidaadependnciaparaosuportetrocadedadosnoformato
JSON.DestaformaserpossvelenviarereceberdadosnoformatoJSONentreasrequisiese
respostasdoclienteaoservidor
Linhas27a47:NesteintervalosoinformadastodasasdependnciasdoHibernate.OHibernateum
frameworkqueviabilizaomapeamentoobjetorelacionalentreastabelasdobancodedadoseasclasses
Java.LembresequeasclassesJavarepresentamasentidadesdomundorealnosistema.importante
frisaraindaqueemboratenhamosadotadooHibernate,programaticamenteiremosutilizarasinterfaces
daespecificaoJPAparaacessoaobanco
Linhas48a53:AquidefinidaadependnciadabibliotecadoMySQL.OHibernatefarusodestapara
acessarobancodedados.
Definidasasdependncias,vamosconfigurarumservidorwebquerodeaplicaesJavaEE.Paraisso,
podemosusaroWildFly,GlassFish,dentreoutros,porm,nesteartigoseradotadooTomcat7.
ComoaApachedisponibilizaomesmoatravsdeumpluginparaprojetosdesenvolvidoscomoMaven,a
suainstalaonoEclipsebastantesimples.Bastaadicionaroblocodecdigoreferenteaoplugindo
Tomcatnopom.xmleexecutaroprojetodefinindoocampoGoalscomovalortomcat7:run,como
podemosverificarnajanelaRunConfigurationsdoEclipse(videFigura6).
FeitoissooMavenirbaixartodososarquivosnecessriosparaorepositriolocaledepoisirlevantaro
servidornoendereolocalhost:8080.Aslinhas68a78mostramcomoconfiguraresseplugin,onde
informamosoGroupId,ArtifactId,versioneopathparaformaraURLaseracessadapelasrequisies
HTTP.
Realizadasasconfiguraes,executeoprojetoparaverificaroresultadonobrowser.Durantea
compilaodoprojetovocpodeacompanharodownloaddoplugindoTomcat7atravsdoconsoledo
Eclipse.AofinalserapresentadaaURLdoservidor.Apartirdeentopodemosinformaramesmano
browserparaverificaraaplicaorodando,comodemonstraaFigura7.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 9/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura6.Configurandoobuilddoprojeto.
abririmagememnovajanela
Figura7.Projetocadastrodeclientesemexecuonobrowser.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 10/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
AFigura8apresentaoDERdanossaaplicaosendocompostoporapenasumatabela,denomecliente,
responsvelporarmazenarosdadosdosclientesaseremcadastrados.
ParageraroscriptSQLparaoMySQL,cliquenomenuFile>Export>SQLCreateScript.Feitoisso,ser
abertaumanovatelaconformeapresentadonaFigura9.Ento,selecioneaopoMySQLnoTarget
DataBaseecliquenobotoCopyscripttoClipboardparacopiaroscript.Logoaps,abraalguma
ferramentadegernciadobancodedados,comooMySQLWorkbench,crieumbancodedadoschamado
bd_clienteeexecuteoscriptdaListagem2,geradopeloDBDesignerFork.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 11/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura8.DERdobancodedadoscadastrodeclientes.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 12/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura9.GerandoscriptSQL.
Listagem2.ScriptSQLparacriaratabelacliente.
CREATETABLEcliente(
id_clienteINTEGERUNSIGNEDNOTNULLAUTO_INCREMENT,
nomeVARCHAR(100)NULL,
cpf_cnpjVARCHAR(14)NULL,
rgVARCHAR(20)NULL,
enderecoVARCHAR(100)NULL,
bairroVARCHAR(60)NULL,
cidadeVARCHAR(60)NULL,
estadoVARCHAR(50)NULL,
telefoneVARCHAR(12)NULL,
emailVARCHAR(50)NULL,
data_cadastroDATENULL,
PRIMARYKEY(id_cliente));
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 13/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Sendoassim,vamoscriarumaclassedenomeClienteModelpararepresentaraentidadecliente.Nesta
classedeclararemososatributosreferentesscolunasdatabelaclientedobancodedados,processo
estequeconhecidocomomapeamentoobjetorelacional.Paraisso,primeirocriaremosumapasta
chamadajavadentrodapastamaindoprojeto.
importanteseguirestasinstruesporquecasovoccrieumapastacomumnomediferentedejava,o
JerseyeoHibernatepodemnoencontrarasclassesClienteModeleClienteService,queserocriadas
paraexporoservioRESTcomasoperaesdoCRUD.
Paracriarapastajava,cliquecomobotodireitonapastamainedepoisnaopoNew>Folder.Em
seguida,definaonomecomojavaecliqueemFinish.
Agora,cliquecomobotodireitonapastasrc/main/javaedepois,aoselecionaraopoNew>Class,
definaonomedaclassecomoClienteModel,nopacotebr.com.devmedia.model,ecliqueemFinish.
Realizadoesteprocedimento,teremosoprojetocomaestruturaapresentadanaFigura10.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 14/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura10.Estruturadoprojeto.
CriadaaclasseClienteModel,vocdeveimplementlaconformeocdigoapresentadonaListagem3.
Listagem3.CdigodaclasseClienteModel.
01packagebr.com.devmedia.model;
02
03importjava.util.Date;
04importjavax.persistence.Column;
05importjavax.persistence.Entity;
06importjavax.persistence.GeneratedValue;
07importjavax.persistence.GenerationType;
08importjavax.persistence.Id;
09importjavax.persistence.Table;
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 15/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
10importjavax.persistence.Temporal;
11importjavax.persistence.TemporalType;
12
13@Entity
14@Table(name="cliente")
15publicclassClienteModel{
16@Id
17@GeneratedValue(strategy=GenerationType.IDENTITY)
18intid_cliente;
19
20@Column(name="nome")
21Stringnome;
22
23@Column(name="cpf_cnpj")
24Stringcpf_cnpj;
25
26@Column(name="rg")
27Stringrg;
28
29@Column(name="endereco")
30Stringendereco;
31
32@Column(name="bairro")
33Stringbairro;
34
35@Column(name="cidade")
36Stringcidade;
37
38@Column(name="estado")
39Stringestado;
40
41@Column(name="email")
42Stringemail;
43
44@Column(name="data_cadastro")
45@Temporal(TemporalType.TIMESTAMP)
46Datedata_cadastro;
47
48publicintgetId_cliente(){
49returnid_cliente;}
50
51publicvoidsetId_cliente(intid_cliente){
52this.id_cliente=id_cliente;}
53
54publicStringgetNome(){
55returnnome;}
56
57publicvoidsetNome(Stringnome){
58this.nome=nome;}
59
60}
Comopodemosverificar,essecdigotemalgumasparticularidadeseanotaesdaJPAquemerecem
destaque.Assim,aseguiranalisamososdetalhesdessaimplementao:
Linha13:Nestalinhainformadaaanotao@EntitydaJPA.Elaresponsvelpordefinirquea
classeClienteModelumaestruturademapeamentoobjetorelacionalecorrespondeaumarefernciaa
umatabelanabasededados
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 16/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Linha14:Aquidefinidaaanotao@Tablecomapropriedadenameespecificadacomovalor
cliente.Destemodo,informamosqueaclasseClienteModelcorrespondetabeladenomeclientedo
bancodedados
Linhas16a18:Nesteintervalofoidefinidaapropriedadeid_clientecomasanotaes@Id,para
especificarquechaveprimria,e@GeneratedValue,paraespecificarqueovalordachaveprimria
devesergeradoautomaticamentepelobancodedados
Linhas20a42:NesteintervalosodeterminadasasdemaispropriedadesdaclasseClienteModel.
Percebaquetodassoanotadascom@Columnparainformarquerepresentamcolunasnatabelacliente
dabasededados
Linha45:Estalinhaexpeaanotao@Temporalparaapropriedadedata_cadastro.Assim,
definidoqueestecampoirtrabalharcomvaloresnoformatodata
Linhas48a58:Nesteintervalosoimplementadososmtodosdeacesso(gettersesetters)de
algumaspropriedadesdaclasseClienteModel.Vocpodegerarestesmtodosautomaticamenteno
Eclipse.Paraisso,bastaclicarcomobotodireitonaopoSource>GenerateGettersandSetterse
marcartodososatributosparaosquaisdesejagerarosrespectivosmtodos.
Ditoisso,crieapastaMETAINFdentrodejavaedepoiscrieoarquivopersistence.xml.Apseste
procedimentoaestruturadepastasdoprojetodeveestarsemelhanteapresentadanaFigura11.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 17/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura11.Estruturadepastasparainclusodoarquivopersistence.xml.
Comopersistence.xmlemmos,podemosconfigurloparainformaraclasseClienteModel,oprovedor
deacessoadados,odialetodoSGBDeosdadosparaconexocomobancodedados,ouseja,o
endereodobanco,ousurioesenha.AListagem4mostracomodeveficaressearquivo.
Listagem4.Cdigodoarquivopersistence.xml.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 18/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
01<persistencexmlns="http://java.sun.com/xml/ns/persistence"
02xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
03xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
04http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
05version="2.0">
06<persistenceunitname="app_crud_cliente">
07<provider>org.hibernate.ejb.HibernatePersistence</provider>
08<class>br.com.devmedia.model.ClienteModel</class>
09<properties>
10<propertyname="javax.persistence.jdbc.driver"value="com.mysql.jdbc.Driver"/>
11<propertyname="javax.persistence.jdbc.url"value="jdbc:mysql://localhost/bd_cliente"/>
12<propertyname="javax.persistence.jdbc.user"value="root"/>
13<propertyname="javax.persistence.jdbc.password"value="root"/>
14<propertyname="hibernate.dialect"value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
15</properties>
16</persistenceunit>
17</persistence>
Vejamososdetalhesdaconfiguraodopersistence.xml:
Linha6:Nestalinhainformadoopersistenceunit,abaseparainiciaraconfiguraodo
persistence.xml.Percebaqueapropriedadename,namesmalinha,recebeuovalor
"app_crud_cliente".Portanto,estenomequeinformaremosnaconfiguraodo
EntityManagerFactoryqueiremoscriarmaisadiantenoartigo,paraquepossaseridentificadaa
configuraodopersistence.xmleassimcriaroEntityManagerparaacessoaobancodedados
Linha7:AquiinformadooprovedorORMqueimplementaoJPA,nestecasooHibernate
Linha8:NestalinhainformadaaclasseClienteModel,responsvelpelomapeamentocomobanco
dedados
Linhas9a15:Nesteblocodecdigosoinformadasaspropriedadesdeconexocomobancode
dados,comoodriverdoMySQL,aURLdeacessoaoservidordobancodedadosseguidapelonomedo
banco,ousurioeasenha.
Criando o EntityManager
Oprximopassocriaraclassequetenhaummtodoresponsvelporretornarumobjetodotipo
EntityManager.oEntityManagerquedisponibilizatodososmtodosqueprecisamosparaconseguir
acessoaobancodedadosequeveremosmaisfrente.
Sendoassim,criaremosumaclasse,chamadaJpaEntityManager,paragerenciaraconexocomo
bancodedadosMySQL.Dentrodamesmadevemosdeclarardoisobjetosparasetarafbricadeobjetos,
isto,setarEntityManagerFactorycomasconfiguraesdoarquivopersistence.xml.Assim,podemos
obterumainstnciadoEntityManagerpara,defato,chamarseusmtodoserealizarasoperaesdo
CRUD.
Portanto,crieaclasseJpaEntityManagernopacotebr.com.devmedia.EntityManager.Seucdigo
fonteapresentadonaListagem5.
Listagem5.CdigodaclasseJpaEntityManager.
01packagebr.com.devmedia.EntityManager;
02
03importjavax.persistence.EntityManager;
04importjavax.persistence.EntityManagerFactory;
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 19/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
05importjavax.persistence.Persistence;
06
07publicclassJpaEntityManager{
08
09privateEntityManagerFactoryfactory=Persistence.createEntityManagerFactory("app_crud_cliente");
10privateEntityManagerem=factory.createEntityManager();
11
12publicEntityManagergetEntityManager(){
13returnem;
14}
15}
Comopodemosverificar,elebemsimples.Vejamososseusdetalhes:
Linha9:NestalinhacriadoumobjetochamadofactorydotipoEntityManagerFactory.Estefoi
definidoparareceberumainstnciadoprprioEntityManagerFactory.Paraisso,chamamosomtodo
createEntityManagerFactory()daclassePersistence,querecebecomoparmetroonome
app_crud_cliente,nomeestequefoiinformadonopersistence.xml,napropriedadepersistence
unit
Linha10:Nestetrechofoicriadomaisumobjeto,chamadoemedotipoEntityManager.Omesmo
recebeumainstnciadoEntityManageratravsdachamadaaomtodocreateEntityManager()do
objetofactorycriadoanteriormente
Linhas12a14:NesteblocofoidefinidoummtodochamadogetEntityManager().Esteretornaum
objetoEntityManagerpararealizarasoperaesdoCRUDnobancodedadosatravsdeseusmtodos.
Onossoweb.xmldeveserconfiguradoconformeocdigodaListagem6,ondesoinformadososdados
daAPIdoJersey,isto,ondedefinidoqueoservletdoJerseyqueseroresponsvelporreceberas
requisiesHTTPreferentesschamadasaoservio.
Listagem6.DefiniodoservletdoJerseynoarquivoweb.xml.
01<!DOCTYPEwebappPUBLIC
02"//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"
03"http://java.sun.com/dtd/webapp_2_3.dtd">
04
05<webapp>
06<displayname>ArchetypeCreatedWebApplication</displayname>
07
08<servlet>
09<servletname>CRUDCadastrodeClientes</servletname>
10<servletclass>com.sun.jersey.spi.container.servlet.ServletContainer</servletclass>
11<initparam>
12<paramname>com.sun.jersey.config.property.packages</paramname>
13<paramvalue>br.com.devmedia.service</paramvalue>
14</initparam>
15
16<initparam>
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 20/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
17<paramname>com.sun.jersey.api.json.POJOMappingFeature</paramname>
18<paramvalue>true</paramvalue>
19</initparam>
20
21<loadonstartup>1</loadonstartup>
22</servlet>
23
24<servletmapping>
25<servletname>CRUDCadastrodeClientes</servletname>
26<urlpattern>/apirest/*</urlpattern>
27</servletmapping>
28</webapp>
ParaentendermelhoressecdigoXML,vejamossuaanlise:
Linha10:Nestalinhadefinidaaclassequerepresentaoservletdaaplicao.Nestecasofoi
informadoServletContainer,doJersey
Linhas11a14:Nesteblocoinformadoopacotequeirconterasclassesquerepresentamoservio
econtmosmtodosaseremexpostos.Nestecasofoiinformadoopacotebr.com.devmedia.service,
queaindavamoscriar
Linhas16a19:Nesteblocosodefinidosoutrosparmetrosparaoservio.DessavezparaaAPIde
JSONdoJersey,paraqueelapossarealizaromapeamentoqueviabilizaaconversodasrequisiesno
formatoJSONemclassesJava.Omesmovaleparaasrespostasdoservidoraocliente,natransformao
objetoJava>JSON
Linhas24a27:NesteblococonfiguradaaURLparaacessoaosrecursosdoservidor,oumelhor,s
operaesdoCRUDaseremexpostaspeloservio.Atravsdatagurlpatterndefinidoocaminho
padrodeacessosURLsdoservio,como:http://localhost:8080/apirest/cliente/cadastrar.
Observandoessaimagempodemosnotarumaorganizaonaestruturadospacotesdoprojeto.Sendo
assim,humpacotepararepresentarasclassesquerepresentamasentidades,outroparaasclassesde
servioe,porfim,opacotequeencapsulaoacessodados.Destaformaoprojetosetornabem
estruturadoecomresponsabilidadesbemdefinidas,facilitandopossveisatualizaesemanutenes.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 21/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Figura12.EstruturadoprojetoapscriaraclasseClienteService.
Listagem7.CdigodoservioRESTclasseClienteService.
01packagebr.com.devmedia.service;
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 22/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
02
03@Path("/cliente")
04publicclassClienteService{
05privateJpaEntityManagerJPAEM=newJpaEntityManager();
06privateEntityManagerobjEM=JPAEM.getEntityManager();
07
08@GET
09@Path("/listar")
10@Produces("application/json")
11publicList<ClienteModel>listar(){
12
13try{
14Stringquery="selectcfromClienteModelc";
15List<ClienteModel>clientes=objEM.createQuery(query,ClienteModel.class).getResultList();
16objEM.close();
17returnclientes;
18}catch(Exceptione){
19thrownewWebApplicationException(500);
20}
21}
22
23@GET
24@Path("/buscar/{id_cliente}")
25@Produces("application/json")
26publicClienteModelbuscar(@PathParam("id_cliente")intid_cliente){
27try{
28ClienteModelcliente=objEM.find(ClienteModel.class,id_cliente);
29objEM.close();
30returncliente;
31}catch(Exceptione){
32thrownewWebApplicationException(500);
33}
34}
35
36@POST
37@Path("/cadastrar")
38@Consumes("application/json")
39publicResponsecadastrar(ClienteModelobjClinte){
40try{
41objEM.getTransaction().begin();
42objEM.persist(objClinte);
43objEM.getTransaction().commit();
44objEM.close();
45returnResponse.status(200).entity("cadastrorealizado.").build();
46}catch(Exceptione){
47thrownewWebApplicationException(500);
48}
49}
50
51@PUT
52@Path("/alterar")
53@Consumes("application/json")
54publicResponsealterar(ClienteModelobjClinte){
55try{
56objEM.getTransaction().begin();
57objEM.merge(objClinte);
58objEM.getTransaction().commit();
59objEM.close();
60returnResponse.status(200).entity("cadastroalterado.").build();
61}catch(Exceptione){
62thrownewWebApplicationException(500);
63}
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 23/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
64}
65
66@DELETE
67@Path("/excluir/{id_cliente}")
68publicResponseexcluir(@PathParam("id_cliente")intid_cliente){
69try{
70ClienteModelobjClinte=objEM.find(ClienteModel.class,id_cliente);
71
72objEM.getTransaction().begin();
73objEM.remove(objClinte);
74objEM.getTransaction().commit();
75objEM.close();
76
77returnResponse.status(200).entity("cadastroexcludo.").build();
78}catch(Exceptione){
79thrownewWebApplicationException(500);
80}
81}
82}
NestecdigopodemosverificarqueosverbosdoprotocoloHTTP(GET,POST,PUTeDELETE)so
utilizadosparacadaoperaodoCRUD.OverboPOST,porexemplo,empregadoparaaoperao
relacionadaaocadastrodeclientes.ParaalteraodosdadosfoiadotadooPUT,DELETEparaexclusoe
GETparaobteralistagemdosclientes.NocdigoaindapodemosverificaralgumasanotaesdoJAXRS
eousoderecursosdaJPA.
AseguirsoapresentadososprimeirosdetalhesdaclasseClienteService,queseranalisadamaisa
fundonosprximostpicos:
Linha03:LocalondedefinimosqueaclasseClienteServiceserumservio.Paraissofoiinseridaa
anotao@PathpassandocomoparmetroonomedoservioqueircomporaURLdeacessoaos
recursosdoservidor.
Apartirdisso,ocaminhoparaacesoaoservioser:http://localhost:8080/apirest/cliente/.Lembrese
queapiresteaportaforamdefinidosnomapeamentodoservletdoJerseynoweb.xml
Linhas05e06:Nalinha5foicriadoumobjetodaclasseJpaEntityManager.Logodepois,nalinha6
criadooutroobjeto,chamadoobjEM.EsterecebeumEntityManageratravsdachamadaaomtodo
getEntityManager()deJpaEntityManager.oobjEMqueirpossibilitaroacessoadados.
Paramelhorentendimentoemostrarnaprticaoconsumodosmtodos(recursos)donossoserviode
cadastrodecliente,iremosinstalarumcomplementodoFirefoxchamadodeHttpRequester.Comesse
intuito,acesseaopoComplementosdestenavegador,procureporHttpRequestereentocliqueem
Instalar.EstepossibilitarealizarrequisiesaserviosRESTutilizandovriosverbosdoprotocoloHTTP.
Aimplementaodestemtodo,equivalenteoperaoReaddoCRUD,explicadaaseguir:
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 24/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Linhas08a21:Esteblocodecdigodefineoprimeiromtododoservio,olistar(),queretornauma
listadeClienteModel.Nalinha08foiutilizadaaanotao@GETparainformarqueestemtodos
poderserrequisitadoporumarequisiodotipoGETnoprotocoloHTTP.
Nalinha09informadaaanotao@Path,querecebeporparmetroonomedorecursodoservio
nestecasoonomefinaldaURLqueapontaparaorecursodelistagemdeclientesnoservidor,listar.Vale
ressaltarqueovalordapropriedadenamede@Pathnoprecisaseromesmonomedomtodoiniciado
nalinha11,masdeixamosomesmoapenasparafacilitaroentendimento.
Nalinha10foiespecificadaaltimaanotaodomtodolistar:@Produces.Estaserveparainformarao
Jerseyqueeledeveretornaraoclientealistagemdalinha17noformatoJSON
Linha13a20:Estaaimplementaodocdigoqueefetivamenteirbuscaralistagemdeclientes,
ondedefinidaumaStringchamadaqueryquerecebeaconsultaaserrealizadanobancodedados.Em
seguida,nalinha15oobjetoclientesrecebeoresultadodaconsultaatravsdachamadaaosmtodos
createQuery()egetResultList(),disponveisnoobjetoEntityManager,enalinha16encerradoo
EntityManagerchamandoomtodoclose().Porfim,nalinha19criadoumthrowatravsdaclasse
WebApplicationExceptionpararecuperarmospossveiserrosduranteaexecuoeinformarao
solicitantedoservio.
NaFigura13expomosoresultadodeumarequisiodotipoGETaorecursolistarclientes.Paraisso,
percebaqueprecisamosapenasinformaraURLdoservioeselecionaroverboGET.Antesderealizaro
teste,noentanto,abraalgumgerenciadordebancodedadosMySQLeinsiraalgunsclientesnatabela
cliente.
abririmagememnovajanela
Figura13.Consumodorecursolistarclientes.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 25/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Outroimportanterecursodonossoservioabuscadeclientesnabasededadospeloid.Relacionado
operaoReaddoCRUD,arequisioaesterecursogeralmenterealizadaatravsdeumarequisio
dotipoGET.
Nocdigodoprojetoexemplo,omtodobuscar()recebeoiddoclienteaserpesquisadoeretornaos
dadosdomesmonoformatoJSON,quandoencontrado.Faamosumaanlisedoseucdigo:
Linhas23a26:Nestaslinhassodeclaradasasanotaes@GET,@Pathe@Producesparaindicar,
respetivamente,otipodemtodoHTTP,ocaminhodeacessoaorecursoeotipodosdadosquesero
retornados(JSON,nestecaso).Percebaaindaquenalinha24informadoumparmetrochamado
id_clienteparareceberocdigodoclientenarequisioGET.atravsdesteparmetroqueobtidoo
cdigoaserpesquisadonobancodedados
Linha26:Aquitemosadeclaraodomtodobuscar(),localondetambmfazemosusodaanotao
@PathParam,querecebeonomedoparmetroaserpassadocomocdigodoclientejuntoURLde
requisio
Linha28:NestalinhacriadoumobjetodotipoClienteModelparareceberosdadosdocliente
pesquisadonabasededados.Vejaqueaconsultafoirealizadaatravsdomtodofind(),querecebeuo
tipodomodelaserpesquisadoeoiddocliente.Naslinhas29e30oEntityManagerencerradoe
retornadooclientepesquisadonoformatoJSON.
NaFigura14podemosverificaroresultadodoconsumodorecursobuscarclienteatravsdeuma
requisiodotipoGETcomaferramentaOpenHttpRequester.
abririmagememnovajanela
Figura14.Consumodorecursobuscarcliente.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 26/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
AprximaoperaodoCRUDquecodificamoscomoumserviooCreate,paracadastrarumnovo
clientenabasededados.Paraisso,devemosrealizarumarequisiodotipoPOSTpassandonocorpoda
mesmaosdadosdonovocliente.Osdetalhesdesuaimplementaosoapresentadosaseguir:
Linha38:Oprimeiropontoadestacarnestecdigoapresenadeumanovaanotao,chamada
@Consumes.EstatemcomofunodefinirotipodedadoaserrecebidopelarequisioPOST,neste
casooJSON
Linha39:Nestalinhatemosadeclaraodomtodo,quecomoparmetrorecebeoobjetoclienteaser
cadastradonobanco
Linhas41a43:Nesteintervaloiniciadaumanovatransaocomobancodedados.Nalinha42um
novoclientepersistido.Porfim,realizadoumcommitparaqueomesmosejagravado
permanentemente
Linha46:Nestalinhautilizadoomtodostatus()daclasseResponsepararetornaraoclienteo
cdigo200doHTTP.Istoinformaqueoclientefoicadastradocomsucesso.
NaFigura15podemosverificaroresultadodarequisioPOSTaorecursocadastrar.Percebaqueos
dadosdonovoclienteestonoformatoJSON,poisesteoformatoesperadopeloservidor,conforme
explicitadopelaanotao@Consumes(application/json).
abririmagememnovajanela
Figura15.Consumodorecursocadastrarcliente.
Linha51:Nestalinhainformadaaanotao@PUT,definindoquearequisiodeveusaromtodo
PUTdoprotocoloHTTP
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 27/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Linha53:Aquiespecificadaaanotao@Consumesparainformarqueosdadosrecebidospela
requisiodevemestarnoformatoJSON.DestemodooJerseypoderfazeraconversoparaobjetos
Java
Linhas56a58:Nesteintervaloiniciadaumanovatransao(videlinha56).Emseguidaosdadosdo
clientesoalteradosnabaseatravsdachamadaaomtodomerge()doEntityManager,querecebe
porparmetrooclienteaseratualizado.Porfim,nalinha58realizadoocommitparapersistiressa
mudana
Linha60:NestalinhautilizadanovamenteaclasseResponse,queatravsdomtodostatus()
retornaocdigo200informandoqueocadastrodoclientefoialteradocomsucesso.
NaFigura16possvelverificaroconsumodorecursoquealteraasinformaesdeumclientenobanco
dedados.
abririmagememnovajanela
Figura16.Consumodorecursoalterarcliente.
Linha66:Aquifoiutilizadaaanotao@DELETE,quedefinequesomenterequisiescomoverbo
DELETEdoprotocoloHTTPpodemrequisitaresterecursodoservio
Linha67:Percebanestalinhaqueinformadocomoparmetrooiddoclienteaserexcludodabase
dedados.ParaqueoserviopossareceberoparmetronecessrioinformaroIDdoclientenofinalda
URI
Linha70:Nestalinhapodemosverificarabuscanobandodedadosdoclienteaserexcludo
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 28/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
Linhas72a74:Nesteintervalodeclaramosumatransaoqueexcluioclientedobancodedados
atravsdachamadaaomtodoremove()deEntityManager.Comoparmetroestemtodorecebeo
cliente.Nalinha74efetuamosocommit()
Linha77:Porfim,retornadoocdigo200paraindicarqueoclientefoiexcludocomsucesso.
VejanaFigura17oresultadodoconsumodorecursorelacionadoexclusodeumclientenobancode
dados.
abririmagememnovajanela
Figura17.Consumodorecursoexcluircliente.
OdesenvolvimentodeaplicaesqueadotamopadroarquiteturalRESTsegueemaltaeprovavelmente
continuarassimatqueumasoluomaissimpleselevesejaapresentadacomunidade.Destemodo,
sevocaindanoestutilizandoestasoluoemsuasaplicaesquerequeremwebservices,este
artigoservecomoumtimopontodepartidaparaisso.
Comanecessidadedesoluescadavezmaisintegradas,ousodeserviosjsetornouumaforte
vertentenomundododesenvolvimento.Conheceresabercomoimplementlos,portanto,umrequisito
essencialatodoprofissionalqueatuanarea.
Links
EndereoparadownloaddoEclipseLuna.
https://www.eclipse.org/downloads/packages/eclipseidejavaeedevelopers/lunasr2
PginadoprojetoDBDesignerFork.
http://sourceforge.net/projects/dbdesignerfork/
DissertaodeRoyFielding.
https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 29/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL
PginadoprojetoJersey.
https://jersey.java.net/
EndereoparadownloaddoMySQL.
http://www.mysql.com/downloads/
JavaPersistenceAPI.
http://www.oracle.com/technetwork/java/
javaee/tech/persistencejsp140049.html
WhatareRESTfulWebServices?
https://docs.oracle.com/javaee/6/tutorial/doc/gijqy.html
MadsonAguiarRodrigues
FormaoacadmicaemAnliseeDesenvolvimentodeSistemaspelaUNOPAR,psgraduaoemEngenhariadeSistemaspela
ESABeespecialistaemTecnologiasparaaplicaesWebpelaUNOPAR.Trabalhacomdesenvolvimentodesoftwareh[...]
Publicadoem1899
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 30/30