SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Novas APIs do
Java EE 7
E a batalha contra a complexidade
Helder da Rocha
helder@argonavis.com.br
Objetivos
Falar um pouco de complexidade do software e
apresentar três APIs do Java EE 7 que simplificam o
processo de desenvolvimento
Conteúdo
Breve reflexão sobre complexidade e entropia
JMS 2.0
APIs de Web Services (SOAP e REST)
O futuro?
2
"A complexidade do
software é uma
propriedade 

essencial, e não
acidental"
F. Brooks
Ilusão da simplicidade
Fonte: Booch
Fonte: Grady Booch "Object Oriented Analysis and Design"
Evolução das APIs
Uma API deve ser a mais simples possível
Contratos mais simples
Menos burocracia
Menos necessidade de documentação
Mas… problema inerente ao software: complexidade
Entropia sempre crescente
Sucesso depende do controle da complexidade
6
1.0
2.0
3.0
1.0
1.0
2.0
Java EE 7
Objetivo sempre presente na evolução das APIs:
Simplificar o uso!
Menor curva de aprendizado
Mais defaults, menos configuração
Menos, menos, menos
(até mesmo o JSF conseguiu ficar mais simples na Java EE 7 :-)
Java Message Service 1.0
Queue

Connection

Factory
Queue

Connection
Queue

Session
Queue

Sender
Queue

Receiver
Message
Queue
createSession()
jndi.lookup(queueFactory)
createConnection()
createMessage()
create() create()
receive()send()
jndi.lookup(queue)
API para enviar e receber
mensagens usa classes e
métodos diferentes para
domínios Queue e Topic
Java Message Service 1.1
Connection

Factory
Connection
SessionMessage

Producer
Message

Consumer
Message
Destination
createSession()
jndi.lookup(factory)
createConnection()
createMessage()
create() create()
receive()send()
jndi.lookup(destination)
API para enviar e receber
mensagens usa classes e
métodos iguais para
domínios Queue e Topic
Java Message Service 2.0
10
Connection

Factory
JMSContextJMSProducer JMSConsumer
Message
Destination
@Inject factory
createJMSContext()
createMessage()
create() create()
receive()send()
@Inject destination
@Inject em vez de JNDI
Menos código para enviar
e receber mensagens
Java Message Service 2.0
11
Connection

Factory
JMSContext
Destination
@Inject factory
createJMSContext()
receive()send()
@Inject destination
Menos código!
Menos código!
Envio de mensagens JMS 2.0
Antes (JMS 1.1)
JMS 2.0
12
public	
  void	
  sendJMS2(ConnectionFactory	
  conFactory,	
  Queue	
  queue,	
  String	
  text)	
  {	
  
	
  	
  	
  try	
  (JMSContext	
  context	
  =	
  conFactory.createContext();)	
  {	
  
	
  	
  	
  	
  	
  	
  context.createProducer().send(queue,	
  text);	
  
	
  	
  	
  }	
  catch	
  (JMSRuntimeException	
  ex)	
  {	
  //	
  handle	
  exception	
  }	
  
}
public	
  void	
  sendJMS11(ConnectionFactory	
  conFactory,	
  Queue	
  queue,	
  String	
  text)	
  {	
  
	
  	
  	
  try	
  {	
  

	
  	
  	
  	
  	
  	
  Connection	
  con	
  =	
  conFactory.createConnection();	
  

	
  	
  	
  	
  	
  	
  try	
  {	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  Session	
  session	
  =	
  con.createSession(false,Session.AUTO_ACKNOWLEDGE);	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  MessageProducer	
  messageProducer	
  =	
  session.createProducer(queue);	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  TextMessage	
  textMessage	
  =	
  session.createTextMessage(text);	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  messageProducer.send(textMessage);	
  

	
  	
  	
  	
  	
  	
  }	
  finally	
  {	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  connection.close();	
  

	
  	
  	
  	
  	
  	
  }	
  

	
  	
  	
  }	
  catch	
  (JMSException	
  ex)	
  {	
  //	
  handle	
  exception	
  }	
  
	
  }
Recebimento síncrono JMS 2.0
13
Antes (JMS 1.1)
JMS 2.0
public	
  void	
  recJMS2(ConnectionFactory	
  conFactory,	
  Queue	
  queue,	
  String	
  text)	
  {	
  
	
  	
  	
  try	
  (JMSContext	
  context	
  =	
  conFactory.createContext();){	
  
	
  	
  	
  	
  	
  	
  JMSConsumer	
  consumer	
  =	
  context.createConsumer(queue);	
  

	
  	
  	
  	
  	
  	
  this.messageContents	
  =	
  consumer.receiveBody(String.class);

	
  	
  	
  }	
  catch	
  (JMSRuntimeException	
  ex)	
  {	
  //	
  handle	
  exception	
  }	
  
}
public	
  void	
  recJMS11(ConnectionFactory	
  conFactory,	
  Queue	
  queue,	
  String	
  text)	
  {	
  
	
  	
  	
  try	
  {	
  

	
  	
  	
  	
  	
  	
  Connection	
  con	
  =	
  conFactory.createConnection();	
  

	
  	
  	
  	
  	
  	
  try	
  {	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  Session	
  session	
  =	
  con.createSession(false,Session.AUTO_ACKNOWLEDGE);	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  MessageConsumer	
  messageConsumer	
  =	
  session.createConsumer(queue);	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  con.start();	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  TextMessage	
  textMessage	
  =	
  (TextMessage)messageConsumer.receive();	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  this.messageContents	
  =	
  textMessage.getText();

	
  	
  	
  	
  	
  	
  }	
  finally	
  {	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  connection.close();	
  

	
  	
  	
  	
  	
  	
  }	
  

	
  	
  	
  }	
  catch	
  (JMSException	
  ex)	
  {	
  //	
  handle	
  exception	
  }	
  
}
Pré-história do SOAP, parte 1

No princípio, Web Service eram simples
de codificar em XML
POST /ISBNService.jsp HTTP/1.0
Content-type: text/xml

Content-length: 90
<chamada>

<funcao>
<nome>getPrice</nome>
<param>2877142566</param>
</funcao>
</chamada>
HTTP/1.1 200 OK
Content-type: text/xml

Content-length: 77
<resposta>

<funcao>
<param>19.50</param>
</funcao>
</resposta>
ISBNService.jsp
ISBNClient
ISBNQuery
getPrice()
2877142566
19.50
BD
1
2
3
4
gera
requisição
gera
resposta
14
Pré-história do SOAP parte 2
XML-RPC: padronização dos tags para operações,
parâmetros, tipos, etc.
Criado no grupo de discussões xml-dev em 1998
<methodCall>

<methodName>getPrice</methodName>

<params>
<param>
<value><string>2877142566</string></value>
</param>
</param>
</methodCall> <methodResponse>

<params>
<param>
<value><double>19.5</double></value>
</param>
</param>
</methodResponse>
Resposta
Requisição
15
“Simples” requisição SOAP-RPC
POST /xmlrpc-bookstore/bookpoint/BookstoreIF HTTP/1.0
Content-Type: text/xml; charset="utf-8"
Content-Length: 585
SOAPAction: ""
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env="http://www.w3.org/2001/12/soap-envelope"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2001/12/soap-encoding/"
env:encodingStyle="http://www.w3.org/2001/12/soap-encoding/">
<env:Body>
<ans1:getPrice xmlns:ans1="http://mybooks.org/wsdl">
<String_1 xsi:type="xsd:string">2877142566</String_1>
</ans1:getPrice>
</env:Body>
</env:Envelope> Parâmetro (ISBN)
Payload
Mensagem
(envelope)
SOAP
16
Padronização oficial
Muito mais burocrática
Resposta SOAP-RPC
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
SOAPAction: ""
Date: Thu, 08 Aug 2002 01:48:22 GMT
Server: Apache Coyote HTTP/1.1 Connector [1.0]
Connection: close
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope 

xmlns:env="http://www.w3.org/2001/12/soap-envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2001/12/soap-encoding/"
xmlns:ns0="http://mybooks.org/types"
env:encodingStyle="http://www.w3.org/2001/12/soap-encoding/">
<env:Body>
<ans1:getPriceResponse xmlns:ans1="http://mybooks.org/wsdl">
<result xsi:type="xsd:decimal">19.50</result>
</ans1:getPriceResponse>
</env:Body>
</env:Envelope> Resposta (Preço)
Payload
Mensagem
(envelope)
SOAP
17
WSDL para descrever o serviço
Compare	
  com	
  a	
  
mensagem	
  SOAP	
  
mostrada	
  
anteriormente
Informa	
  onde	
  está	
  o	
  serviço	
  (endpoint)
<?xml	
  version="1.0"	
  encoding="UTF-­‐8"?>	
  
<definitions	
  name="BookstoreService"	
  

	
  	
  	
  	
  targetNamespace="http://mybooks.org/wsdl"	
  
	
  	
  	
  	
  xmlns:tns="http://mybooks.org/wsdl"	
  
	
  	
  	
  	
  xmlns="http://schemas.xmlsoap.org/wsdl/"	
  
	
  	
  	
  	
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"	
  
	
  	
  	
  	
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">	
  	
  
	
  	
  	
  <types>...</types>	
  
	
  	
  	
  <message	
  name="BookstoreIF_getPrice">	
  
	
  	
  	
  	
  	
  	
  <part	
  name="String_1"	
  type="xsd:string"/>	
  
	
  	
  	
  </message>	
  
	
  	
  	
  <message	
  name="BookstoreIF_getPriceResponse">	
  
	
  	
  	
  	
  	
  	
  <part	
  name="result"	
  type="xsd:decimal"/>	
  
	
  	
  	
  </message>	
  
	
  	
  	
  <portType	
  name="BookstoreIF">	
  	
  
	
  	
  	
  	
  	
  	
  <operation	
  name="getPrice"	
  parameterOrder="String_1">	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  <input	
  message="tns:BookstoreIF_getPrice"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  <output	
  message="tns:BookstoreIF_getPriceResponse"/>	
  	
  
	
  	
  	
  	
  	
  	
  </operation>	
  
	
  	
  	
  </portType>	
  	
  
	
  	
  	
  <binding	
  ...	
  >	
  ...</binding>	
  	
  
	
  	
  	
  <service	
  ...	
  >	
  ...	
  </service>	
  	
  
</definitions>	
  
Simplificação com JAX-WS

(escondendo a complexidade do XML)
19
@WebService	
  
public	
  class	
  FilmeFacade	
  {	
  
	
  	
  	
  	
  @PersistenceContext(unitName	
  =	
  "FilmesServiceSoap")	
  
	
  	
  	
  	
  EntityManager	
  em;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  public	
  List<Filme>	
  getFilmes()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  String	
  jpql	
  =	
  "select	
  filme	
  from	
  Filme	
  filme";	
  
	
  	
  	
  	
  	
  	
  	
  	
  Query	
  query	
  =	
  em.createQuery(jpql);	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  (List<Filme>)query.getResultList();	
  
	
  	
  	
  	
  }	
  
}
@Entity	
  
public	
  class	
  Filme	
  implements	
  Serializable	
  {	
  
	
  	
  	
  	
  @Id	
  private	
  Long	
  id;	
  
	
  	
  	
  	
  private	
  String	
  titulo;	
  
	
  	
  	
  	
  private	
  String	
  diretor;	
  
	
  	
  	
  	
  private	
  Long	
  ano;	
  
	
  	
  	
  	
  private	
  long	
  duracao;	
  
	
  	
  	
  	
  private	
  String	
  imdb;	
  
}
WEB-INF
web.xml
classes
FilmesServiceSoap.war
Deploy
Endpoint:

http://servidor/FilmesServiceSoap/FilmeFacadeService
Cliente SOAP
Com geração automática do
código SOAP
Ainda assim muito complexo:
a complexidade migrou para
a configuração
20
public	
  class	
  FilmeClient	
  {	
  
	
  	
  	
  	
  public	
  static	
  void	
  main(String[]	
  args)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  FilmeFacadeService	
  service	
  =	
  new	
  FilmeFacadeService();	
  
	
  	
  	
  	
  	
  	
  	
  	
  FilmeFacade	
  proxy	
  =	
  service.getFilmeFacadePort();	
  
	
  	
  	
  	
  	
  	
  	
  	
  listarFilmes(proxy.getFilmes());	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  public	
  static	
  void	
  listarFilmes(List<Filme>	
  filmes)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  for(Filme	
  f	
  :	
  filmes)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  System.out.println(f.getImdb()+":	
  "	
  +	
  f.getTitulo()	
  +	
  "("	
  +	
  f.getAno()	
  +	
  ")");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  System.out.println("	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "	
  +	
  f.getDiretor());	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  System.out.println("	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "	
  +	
  f.getDuracao()	
  +	
  "	
  minutosn");	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
} $	
  java	
  –jar	
  FilmeClient.jar	
  
tt0081505:	
  The	
  Shining(1980)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Stanley	
  Kubrick	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  144	
  minutos	
  
tt1937390:	
  Nymphomaniac(2013)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Lars	
  von	
  Trier	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  330	
  minutos	
  
tt0069293:	
  Solyaris(1972)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Andrei	
  Tarkovsky	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  167	
  minutos	
  
tt1445520:	
  Hearat	
  Shulayim(2011)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Joseph	
  Cedar
Cliente em container
21
@Named("filmesBean")	
  
public	
  class	
  FilmesManagedBean	
  {	
  
	
  	
  	
  	
  @WebServiceRef(wsdlLocation=

	
  	
  	
  	
  	
  	
  "http://localhost:8080/FilmesServiceSoap/FilmeFacadeService?wsdl")	
  
	
  	
  	
  	
  private	
  FilmeFacadeService	
  service;	
  	
  	
  	
  	
  
	
  	
  	
  	
  private	
  List<Filme>	
  filmes;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  @PostConstruct	
  
	
  	
  	
  	
  public	
  void	
  init()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  FilmeFacade	
  proxy	
  =	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  service.getFilmeFacadePort();	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.filmes	
  =	
  proxy.getFilmes();	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  …	
  
}
<h1>Lista	
  de	
  Filmes</h1>	
  
<h:dataTable	
  value="#{filmesBean.filmes}"	
  var="filme”>	
  
	
  	
  	
  <h:column>	
  
	
  	
  	
  	
  	
  <f:facet	
  name="header">IMDB</f:facet>	
  
	
  	
  	
  	
  	
  <a	
  href="http://www.imdb.com/title/#{filme.imdb}">	
  	
  

	
  	
  	
  	
  	
  	
  #{filme.imdb}</a>	
  
	
  	
  	
  </h:column>	
  
	
  	
  	
  <h:column>	
  
	
  	
  	
  	
  	
  <f:facet	
  name="header">Título</f:facet>	
  
	
  	
  	
  	
  	
  	
  #{filme.titulo}	
  
	
  	
  	
  </h:column>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ...	
  
</h:dataTable>
CDI Managed Bean
JSF Facelets
Mais simples. Menos configuração
RESTful Web Services
REST ~= Infraestrutura de um website
recursos (páginas), links, hierarquia
representações de dados e tipos (URIs, MIME)
vocabulário de operações do protocolo HTTP (GET, POST, …)
URIs ~= objetos
pais.estado.cidade	
  	
  
==
http://servidor/aplicacao/pais/estado/cidade/
Representações
XML, JSON, CSV, etc.
Métodos HTTP permitem operações CRUD
Create: POST /pais/estado (<estado>SP</estado>, no corpo)
Retrieve: GET /pais/estado/SP (Retrieve All com GET /pais/estado)
Update: PUT /pais/estado/PB
Delete: DELETE /pais/estado/PB
22
JAX-RS
JAX-RS : API Java para RESTful WebServices
Componentes
Subclasse de Application: configuração
Root resource class: fachada de serviços
Resource method: associados a métodos HTTP (@GET, @POST, etc.)
Providers: produzem ou consomem representações de entidades
em outros formatos (ex: XML, JSON)
JAX-RS usa anotações para configurar os componentes
@ApplicationPath na subclasse de Application
@Path nos Root resource classes
@GET, @POST, etc e @Path nos Resource methods
@Produces, @Consumes nos Providers
@Context para injetar diversos tipos de contexto do ambiente Web
23
Path templates e @PathParam
@Path templates

@Path("/filmes/{imdb}")	
  
Aceita por exemplo: http://abc.com/war/app/filmes/tt0066921
Parâmetros @PathParam

@Path("/filmes/{imdb}")	
  

public	
  class	
  FilmesIMDBResource	
  {	
  
	
  	
  	
  @GET	
  	
  @Produces("text/xml")

	
  	
  	
  public	
  Filme	
  getFilme(@PathParam("imdb")	
  String	
  codigoIMDB)	
  {	
  

	
  	
  	
  	
  	
  	
  return	
  entity.getFilmeByIMDBCode(codigoIMDB);
	
  	
  	
  }	
  
}	
  
24
Diferentes representações de objetos
25
Representação em JSON
{
"@numero": 145,
"nome": "Jeeves",
[ "telefone": {
"ddd": 11, "numero": 34567890
} ]
}
Representação em XML
<pessoa xmlns="http://pessoa" numero="145">
<nome>Jeeves</nome>
<telefone>
<ddd>11</ddd>
<numero>34567890</numero>
</telefone>
</pessoa>
Pessoa pessoa = new Pessoa();
pessoa.numero = 145;
pessoa.nome = "Jeeves";
pessoa.telefone[0] = new Telefone();
pessoa.telefone[0].ddd = 11;
pessoa.telefone[0].numero = 34567890;
class Pessoa {
int numero;
String nome;
Telefone[] telefones = 

new Telefone[3];
}
class Telefone {
int ddd;
int numero;
}
Classes
Objetos
em Java
application/xml application/json
JAXB
Java API for XML Binding
Mapeia classes Java a XML Schema
Classes mapeadas a XML Schema (ferramentas xjc e schemagen)
Objetos mapeados a documentos XML (através da API javax.xml.bind e
operações de serialização em XML (marshalling e unmarshalling)
XML
Schema
Classes
Java
Binding
xjc
schemagen
Documentos
(instâncias
XML)
Objetos
(instâncias
Java)
Marshalling
unmarshal()
marshal()
26
JAXB: exemplo de classe anotada
27
@XmlSchema(namespace	
  =	
  "http://filmes.argonavis.com/")	
  
package	
  com.argonavis.filmes.generated;	
  
@XmlRootElement	
  
public	
  class	
  Sala	
  implements	
  Serializable	
  {	
  
	
  	
  
	
  	
  	
  	
  private	
  List<Assento>	
  assentos;	
  
	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  private	
  String	
  nome;	
  
	
  	
  	
  	
  private	
  int	
  lotacao;	
  
	
  	
  	
  	
  @XmlElementWrapper	
  
	
  	
  	
  	
  @XmlElement(name="assento")	
  
	
  	
  	
  	
  public	
  List<Assento>	
  getAssentos()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  assentos;	
  
	
  	
  	
  	
  }	
  
…	
  
}
Sem @XmlElementWrapper
<sala>

	
  	
  	
  <assentos>…</assentos>

	
  	
  	
  <assentos>…</assentos>

</sala>	
  
Com @XmlElementWrapper
<sala>

	
  	
  	
  <assentos>

	
  	
  	
  	
  	
  	
  <assento>…</assento>

	
  	
  	
  	
  	
  	
  <assento>…</assento>

	
  	
  	
  </assentos>

</sala>
JAXB Marshal / Unmarshal
Unmarshalling = XML àJava
JAXBContext	
  jc	
  =	
  

	
  	
  	
  	
  	
  	
  JAXBContext.newInstance(	
  "com.argonavis.filmes.gen"	
  );	
  

Unmarshaller	
  u	
  =	
  jc.createUnmarshaller();	
  

Filme	
  filme	
  =	
  (Filme)u.unmarshal(	
  new	
  File(	
  "tt1937390.xml"	
  )	
  
);	
  	
  
Marshalling = Java àXML
JAXBContext	
  jc	
  =	
  	
  	
  	
  

	
  	
  	
  	
  	
  	
  JAXBContext.newInstance(	
  "com.argonavis.flmes.gen"	
  );

Filme	
  filme	
  =	
  ObjectFactory.createFilme();

filme.setAno(2014);	
  //	
  alterando	
  objeto

Marshaller	
  m	
  =	
  jc.createMarshaller();	
  

m.marshal(	
  filme,	
  System.out	
  );
28
JSON Binding!
Substituir o provedor JAXB default por EclipseLink MOXy:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Configuração de JAXBContext
Map properties = new HashMap();
props.put("eclipselink.media-type", "application/json");
JAXBContext ctx = JAXBContext.newInstance(new Class[] { Produto.class }, props);
JSON à Java
UnMarshaller u = ctx.createUnMarshaller();
Produto produto= u.unmarshal(new StreamSource(“produto123.json”));
Java à JSON
Marshaller m = ctx.createMarshaller();
m.marshal(produto, System.out);
29
Haverá suporte nativo
a JSON binding no
Java EE 8 (2016)
Cliente REST com java.net
Cliente HTTP!
URL	
  url	
  =	
  new	
  URL("http://localhost:8080/ctx/app/imdb/tt0066921");	
  
HttpURLConnection	
  conn	
  =	
  (HttpURLConnection)	
  url.openConnection();	
  
conn.setRequestMethod("GET");	
  
conn.setRequestProperty("Accept",	
  "application/xml");	
  
if	
  (conn.getResponseCode()	
  !=	
  200)	
  	
  {	
  
	
  	
  	
  throw	
  new	
  RuntimeException("Erro	
  :	
  "	
  +	
  conn.getResponseCode());	
  
}	
  
	
  	
  
BufferedReader	
  br	
  =	
  

	
  	
  	
  	
  new	
  BufferedReader(new	
  InputStreamReader((conn.getInputStream())));	
  
String	
  linha	
  =	
  br.readLine();	
  
System.out.println("Dados	
  recebidos:	
  "	
  +	
  linha);	
  
conn.disconnect();	
  
JAXBContext	
  jc	
  =	
  JAXBContext.newInstance(Filme.class);	
  
Unmarshaller	
  u	
  =	
  jc.createUnmarshaller();	
  
Filme	
  filme	
  =	
  (Filme)	
  u.unmarshal(new	
  StringReader(linha));	
  
	
  	
  
System.out.println(filme.getIMDB());	
  …
30
Cliente Jersey*
Ainda mais simples
ClientConfig	
  config	
  =	
  

	
  	
  	
  	
  new	
  DefaultClientConfig();	
  
Client	
  client	
  =	
  Client.create(config);	
  
URI	
  baseURI	
  =	
  

	
  	
  	
  	
  UriBuilder.fromUri("http://localhost:8080/ctx").build();	
  
WebResource	
  service	
  =	
  client.resource(baseURI);	
  
Filme	
  filme	
  =	
  service.path("app")

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .path("filme/imdb/tt0066921")

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .accept(MediaType.APPLICATION_XML)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .get(Filme.class);	
  
System.out.println(filme.getIMDB());	
  
System.out.println(filme.getTitulo());	
  
System.out.println(filme.getDiretor());
* Existem outras alternativas. Veja RESTEasy
31
Cliente mobile (iPhone)
REST é melhor alternativa para Web Services que fazem
integração como outras plataformas
32
GET	
  http://192.168.1.25/festival/webapi/filme
Glassfish 4.0
1) Cliente REST escrito em Objective-C

rodando em iOS 7 gera requisição
2) Glassfish gera resposta HTTP
com lista de filmes em JSON
3) iPhone extrai dados e
preenche UITableView
O futuro
Java EE 8 promete uma vida menos complexa
API de segurança unificada
API de transações unificada
CDI com papel central em todas as aplicações
JSON binding nativo
Melhor integração com WebSockets
Mas, ...
A entropia continua a crescer... + linguagens + bugs +
problemas + ameaças + horizontes + iOT + ... a luta continua!
Fonte: http://tinyurl.com/7zlytsm
"the singularity is near!"Ray Kurzweil
helder@argonavis.com.br

Mais conteúdo relacionado

Mais procurados

Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Jeison Barros
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoEduardo Mendes
 
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasRodrigo Branas
 
Trabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiTrabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiMateus Ramos Pereira
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3David Ruiz
 
Introdução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com JavaIntrodução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com JavaFellipeFonseca
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
Bloco 5.1 - Manipulação do DOM
Bloco 5.1 - Manipulação do DOMBloco 5.1 - Manipulação do DOM
Bloco 5.1 - Manipulação do DOMRuâni Filipe Silva
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsDenis L Presciliano
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6danielfcampos
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 

Mais procurados (20)

Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuração
 
Tutorial +login+mvc
Tutorial +login+mvcTutorial +login+mvc
Tutorial +login+mvc
 
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo Branas
 
Curso de JSP
Curso de JSPCurso de JSP
Curso de JSP
 
Servlets e jsp
Servlets e jspServlets e jsp
Servlets e jsp
 
jsp-intro
jsp-introjsp-intro
jsp-intro
 
Trabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiTrabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial Ii
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3
 
Introdução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com JavaIntrodução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com Java
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
Http Servlet
Http ServletHttp Servlet
Http Servlet
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Curso de Servlets
Curso de ServletsCurso de Servlets
Curso de Servlets
 
Bloco 5.1 - Manipulação do DOM
Bloco 5.1 - Manipulação do DOMBloco 5.1 - Manipulação do DOM
Bloco 5.1 - Manipulação do DOM
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
 
Java Web 1 Introducao
Java Web 1 IntroducaoJava Web 1 Introducao
Java Web 1 Introducao
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 

Destaque (17)

J530 9 jms
J530 9 jmsJ530 9 jms
J530 9 jms
 
Java Messaging Service
Java Messaging ServiceJava Messaging Service
Java Messaging Service
 
HornetQ - 2.Arquitetura do HornetQ
HornetQ - 2.Arquitetura do HornetQHornetQ - 2.Arquitetura do HornetQ
HornetQ - 2.Arquitetura do HornetQ
 
HornetQ - 2.1.HornetQ no Modo Standalone
HornetQ - 2.1.HornetQ no Modo StandaloneHornetQ - 2.1.HornetQ no Modo Standalone
HornetQ - 2.1.HornetQ no Modo Standalone
 
Dark Java (2009)
Dark Java (2009)Dark Java (2009)
Dark Java (2009)
 
Integração de Sistemas e JMS Assíncrono
Integração de Sistemas e JMS AssíncronoIntegração de Sistemas e JMS Assíncrono
Integração de Sistemas e JMS Assíncrono
 
Hornet - 1.Conceitos de Mensageria
Hornet - 1.Conceitos de MensageriaHornet - 1.Conceitos de Mensageria
Hornet - 1.Conceitos de Mensageria
 
HornetQ - 4.Persistência
HornetQ - 4.PersistênciaHornetQ - 4.Persistência
HornetQ - 4.Persistência
 
HornetQ - 11.Mensagens Expiradas
HornetQ - 11.Mensagens ExpiradasHornetQ - 11.Mensagens Expiradas
HornetQ - 11.Mensagens Expiradas
 
HornetQ - 10.Reentrega de Mensagens e DLQ
HornetQ - 10.Reentrega de Mensagens e DLQHornetQ - 10.Reentrega de Mensagens e DLQ
HornetQ - 10.Reentrega de Mensagens e DLQ
 
HornetQ - 12.Paginação
HornetQ - 12.PaginaçãoHornetQ - 12.Paginação
HornetQ - 12.Paginação
 
Minicurso JSON & Ajax
Minicurso JSON & AjaxMinicurso JSON & Ajax
Minicurso JSON & Ajax
 
Gráficos Vetoriais na Web com SVG
Gráficos Vetoriais na Web com SVGGráficos Vetoriais na Web com SVG
Gráficos Vetoriais na Web com SVG
 
O Poderoso AngularJS
O Poderoso AngularJSO Poderoso AngularJS
O Poderoso AngularJS
 
Angular js
Angular jsAngular js
Angular js
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
 
XML: Uma Introdução Prática (2001)
XML: Uma Introdução Prática (2001)XML: Uma Introdução Prática (2001)
XML: Uma Introdução Prática (2001)
 

Semelhante a Novas APIs do Java EE 7: JMS e Web Services

Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraCaelum
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusDenis L Presciliano
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPelliando dias
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
Novidades do ASP.NET Core 2.1
Novidades do ASP.NET Core 2.1Novidades do ASP.NET Core 2.1
Novidades do ASP.NET Core 2.1Rodrigo Kono
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesCI&T
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stackSidney Roberto
 
Artigo distribuidos programação java com rmi e cobra
Artigo distribuidos programação java com rmi e cobraArtigo distribuidos programação java com rmi e cobra
Artigo distribuidos programação java com rmi e cobraGoncalvinho
 

Semelhante a Novas APIs do Java EE 7: JMS e Web Services (20)

Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
ASP.NET AJAX
ASP.NET AJAXASP.NET AJAX
ASP.NET AJAX
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta Cactus
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHP
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Computacao distribuida com rmi
Computacao distribuida com rmiComputacao distribuida com rmi
Computacao distribuida com rmi
 
Ajax como comecar
Ajax como comecarAjax como comecar
Ajax como comecar
 
servlet-introducao
servlet-introducaoservlet-introducao
servlet-introducao
 
Artigoajax
ArtigoajaxArtigoajax
Artigoajax
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
J530 10 mdb
J530 10 mdbJ530 10 mdb
J530 10 mdb
 
Novidades do ASP.NET Core 2.1
Novidades do ASP.NET Core 2.1Novidades do ASP.NET Core 2.1
Novidades do ASP.NET Core 2.1
 
GUJavaSC - Java EE 7 In Action
GUJavaSC - Java EE 7 In ActionGUJavaSC - Java EE 7 In Action
GUJavaSC - Java EE 7 In Action
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stack
 
Artigo distribuidos programação java com rmi e cobra
Artigo distribuidos programação java com rmi e cobraArtigo distribuidos programação java com rmi e cobra
Artigo distribuidos programação java com rmi e cobra
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 

Mais de Helder da Rocha

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsHelder da Rocha
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Helder da Rocha
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosHelder da Rocha
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasHelder da Rocha
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a WebHelder da Rocha
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosHelder da Rocha
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Helder da Rocha
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8Helder da Rocha
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Helder da Rocha
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Helder da Rocha
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 

Mais de Helder da Rocha (20)

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativos
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemas
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a Web
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativos
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 

Último

Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 

Último (9)

Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 

Novas APIs do Java EE 7: JMS e Web Services

  • 1. Novas APIs do Java EE 7 E a batalha contra a complexidade Helder da Rocha helder@argonavis.com.br
  • 2. Objetivos Falar um pouco de complexidade do software e apresentar três APIs do Java EE 7 que simplificam o processo de desenvolvimento Conteúdo Breve reflexão sobre complexidade e entropia JMS 2.0 APIs de Web Services (SOAP e REST) O futuro? 2
  • 3. "A complexidade do software é uma propriedade 
 essencial, e não acidental" F. Brooks
  • 4.
  • 5. Ilusão da simplicidade Fonte: Booch Fonte: Grady Booch "Object Oriented Analysis and Design"
  • 6. Evolução das APIs Uma API deve ser a mais simples possível Contratos mais simples Menos burocracia Menos necessidade de documentação Mas… problema inerente ao software: complexidade Entropia sempre crescente Sucesso depende do controle da complexidade 6 1.0 2.0 3.0 1.0 1.0 2.0
  • 7. Java EE 7 Objetivo sempre presente na evolução das APIs: Simplificar o uso! Menor curva de aprendizado Mais defaults, menos configuração Menos, menos, menos (até mesmo o JSF conseguiu ficar mais simples na Java EE 7 :-)
  • 8. Java Message Service 1.0 Queue
 Connection
 Factory Queue
 Connection Queue
 Session Queue
 Sender Queue
 Receiver Message Queue createSession() jndi.lookup(queueFactory) createConnection() createMessage() create() create() receive()send() jndi.lookup(queue) API para enviar e receber mensagens usa classes e métodos diferentes para domínios Queue e Topic
  • 9. Java Message Service 1.1 Connection
 Factory Connection SessionMessage
 Producer Message
 Consumer Message Destination createSession() jndi.lookup(factory) createConnection() createMessage() create() create() receive()send() jndi.lookup(destination) API para enviar e receber mensagens usa classes e métodos iguais para domínios Queue e Topic
  • 10. Java Message Service 2.0 10 Connection
 Factory JMSContextJMSProducer JMSConsumer Message Destination @Inject factory createJMSContext() createMessage() create() create() receive()send() @Inject destination @Inject em vez de JNDI Menos código para enviar e receber mensagens
  • 11. Java Message Service 2.0 11 Connection
 Factory JMSContext Destination @Inject factory createJMSContext() receive()send() @Inject destination Menos código! Menos código!
  • 12. Envio de mensagens JMS 2.0 Antes (JMS 1.1) JMS 2.0 12 public  void  sendJMS2(ConnectionFactory  conFactory,  Queue  queue,  String  text)  {        try  (JMSContext  context  =  conFactory.createContext();)  {              context.createProducer().send(queue,  text);        }  catch  (JMSRuntimeException  ex)  {  //  handle  exception  }   } public  void  sendJMS11(ConnectionFactory  conFactory,  Queue  queue,  String  text)  {        try  {  
            Connection  con  =  conFactory.createConnection();  
            try  {  
                  Session  session  =  con.createSession(false,Session.AUTO_ACKNOWLEDGE);  
                  MessageProducer  messageProducer  =  session.createProducer(queue);  
                  TextMessage  textMessage  =  session.createTextMessage(text);  
                  messageProducer.send(textMessage);  
            }  finally  {  
                  connection.close();  
            }  
      }  catch  (JMSException  ex)  {  //  handle  exception  }    }
  • 13. Recebimento síncrono JMS 2.0 13 Antes (JMS 1.1) JMS 2.0 public  void  recJMS2(ConnectionFactory  conFactory,  Queue  queue,  String  text)  {        try  (JMSContext  context  =  conFactory.createContext();){              JMSConsumer  consumer  =  context.createConsumer(queue);  
            this.messageContents  =  consumer.receiveBody(String.class);
      }  catch  (JMSRuntimeException  ex)  {  //  handle  exception  }   } public  void  recJMS11(ConnectionFactory  conFactory,  Queue  queue,  String  text)  {        try  {  
            Connection  con  =  conFactory.createConnection();  
            try  {  
                  Session  session  =  con.createSession(false,Session.AUTO_ACKNOWLEDGE);  
                  MessageConsumer  messageConsumer  =  session.createConsumer(queue);  
                  con.start();  
                  TextMessage  textMessage  =  (TextMessage)messageConsumer.receive();  
                  this.messageContents  =  textMessage.getText();
            }  finally  {  
                  connection.close();  
            }  
      }  catch  (JMSException  ex)  {  //  handle  exception  }   }
  • 14. Pré-história do SOAP, parte 1
 No princípio, Web Service eram simples de codificar em XML POST /ISBNService.jsp HTTP/1.0 Content-type: text/xml
 Content-length: 90 <chamada>
 <funcao> <nome>getPrice</nome> <param>2877142566</param> </funcao> </chamada> HTTP/1.1 200 OK Content-type: text/xml
 Content-length: 77 <resposta>
 <funcao> <param>19.50</param> </funcao> </resposta> ISBNService.jsp ISBNClient ISBNQuery getPrice() 2877142566 19.50 BD 1 2 3 4 gera requisição gera resposta 14
  • 15. Pré-história do SOAP parte 2 XML-RPC: padronização dos tags para operações, parâmetros, tipos, etc. Criado no grupo de discussões xml-dev em 1998 <methodCall>
 <methodName>getPrice</methodName>
 <params> <param> <value><string>2877142566</string></value> </param> </param> </methodCall> <methodResponse>
 <params> <param> <value><double>19.5</double></value> </param> </param> </methodResponse> Resposta Requisição 15
  • 16. “Simples” requisição SOAP-RPC POST /xmlrpc-bookstore/bookpoint/BookstoreIF HTTP/1.0 Content-Type: text/xml; charset="utf-8" Content-Length: 585 SOAPAction: "" <?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2001/12/soap-encoding/" env:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> <env:Body> <ans1:getPrice xmlns:ans1="http://mybooks.org/wsdl"> <String_1 xsi:type="xsd:string">2877142566</String_1> </ans1:getPrice> </env:Body> </env:Envelope> Parâmetro (ISBN) Payload Mensagem (envelope) SOAP 16 Padronização oficial Muito mais burocrática
  • 17. Resposta SOAP-RPC HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8" SOAPAction: "" Date: Thu, 08 Aug 2002 01:48:22 GMT Server: Apache Coyote HTTP/1.1 Connector [1.0] Connection: close <?xml version="1.0" encoding="UTF-8"?> <env:Envelope 
 xmlns:env="http://www.w3.org/2001/12/soap-envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2001/12/soap-encoding/" xmlns:ns0="http://mybooks.org/types" env:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> <env:Body> <ans1:getPriceResponse xmlns:ans1="http://mybooks.org/wsdl"> <result xsi:type="xsd:decimal">19.50</result> </ans1:getPriceResponse> </env:Body> </env:Envelope> Resposta (Preço) Payload Mensagem (envelope) SOAP 17
  • 18. WSDL para descrever o serviço Compare  com  a   mensagem  SOAP   mostrada   anteriormente Informa  onde  está  o  serviço  (endpoint) <?xml  version="1.0"  encoding="UTF-­‐8"?>   <definitions  name="BookstoreService"  
        targetNamespace="http://mybooks.org/wsdl"          xmlns:tns="http://mybooks.org/wsdl"          xmlns="http://schemas.xmlsoap.org/wsdl/"          xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"          xmlns:xsd="http://www.w3.org/2001/XMLSchema">          <types>...</types>        <message  name="BookstoreIF_getPrice">              <part  name="String_1"  type="xsd:string"/>        </message>        <message  name="BookstoreIF_getPriceResponse">              <part  name="result"  type="xsd:decimal"/>        </message>        <portType  name="BookstoreIF">                <operation  name="getPrice"  parameterOrder="String_1">                          <input  message="tns:BookstoreIF_getPrice"/>                    <output  message="tns:BookstoreIF_getPriceResponse"/>                </operation>        </portType>          <binding  ...  >  ...</binding>          <service  ...  >  ...  </service>     </definitions>  
  • 19. Simplificação com JAX-WS
 (escondendo a complexidade do XML) 19 @WebService   public  class  FilmeFacade  {          @PersistenceContext(unitName  =  "FilmesServiceSoap")          EntityManager  em;                    public  List<Filme>  getFilmes()  {                  String  jpql  =  "select  filme  from  Filme  filme";                  Query  query  =  em.createQuery(jpql);                  return  (List<Filme>)query.getResultList();          }   } @Entity   public  class  Filme  implements  Serializable  {          @Id  private  Long  id;          private  String  titulo;          private  String  diretor;          private  Long  ano;          private  long  duracao;          private  String  imdb;   } WEB-INF web.xml classes FilmesServiceSoap.war Deploy Endpoint:
 http://servidor/FilmesServiceSoap/FilmeFacadeService
  • 20. Cliente SOAP Com geração automática do código SOAP Ainda assim muito complexo: a complexidade migrou para a configuração 20 public  class  FilmeClient  {          public  static  void  main(String[]  args)  {                  FilmeFacadeService  service  =  new  FilmeFacadeService();                  FilmeFacade  proxy  =  service.getFilmeFacadePort();                  listarFilmes(proxy.getFilmes());          }                    public  static  void  listarFilmes(List<Filme>  filmes)  {                  for(Filme  f  :  filmes)  {                          System.out.println(f.getImdb()+":  "  +  f.getTitulo()  +  "("  +  f.getAno()  +  ")");                          System.out.println("                            "  +  f.getDiretor());                          System.out.println("                            "  +  f.getDuracao()  +  "  minutosn");                  }          }   } $  java  –jar  FilmeClient.jar   tt0081505:  The  Shining(1980)                        Stanley  Kubrick                        144  minutos   tt1937390:  Nymphomaniac(2013)                        Lars  von  Trier                        330  minutos   tt0069293:  Solyaris(1972)                        Andrei  Tarkovsky                        167  minutos   tt1445520:  Hearat  Shulayim(2011)                        Joseph  Cedar
  • 21. Cliente em container 21 @Named("filmesBean")   public  class  FilmesManagedBean  {          @WebServiceRef(wsdlLocation=
            "http://localhost:8080/FilmesServiceSoap/FilmeFacadeService?wsdl")          private  FilmeFacadeService  service;                  private  List<Filme>  filmes;                    @PostConstruct          public  void  init()  {                  FilmeFacade  proxy  =                          service.getFilmeFacadePort();                  this.filmes  =  proxy.getFilmes();          }          …   } <h1>Lista  de  Filmes</h1>   <h:dataTable  value="#{filmesBean.filmes}"  var="filme”>        <h:column>            <f:facet  name="header">IMDB</f:facet>            <a  href="http://www.imdb.com/title/#{filme.imdb}">    
            #{filme.imdb}</a>        </h:column>        <h:column>            <f:facet  name="header">Título</f:facet>              #{filme.titulo}        </h:column>                          ...   </h:dataTable> CDI Managed Bean JSF Facelets Mais simples. Menos configuração
  • 22. RESTful Web Services REST ~= Infraestrutura de um website recursos (páginas), links, hierarquia representações de dados e tipos (URIs, MIME) vocabulário de operações do protocolo HTTP (GET, POST, …) URIs ~= objetos pais.estado.cidade     == http://servidor/aplicacao/pais/estado/cidade/ Representações XML, JSON, CSV, etc. Métodos HTTP permitem operações CRUD Create: POST /pais/estado (<estado>SP</estado>, no corpo) Retrieve: GET /pais/estado/SP (Retrieve All com GET /pais/estado) Update: PUT /pais/estado/PB Delete: DELETE /pais/estado/PB 22
  • 23. JAX-RS JAX-RS : API Java para RESTful WebServices Componentes Subclasse de Application: configuração Root resource class: fachada de serviços Resource method: associados a métodos HTTP (@GET, @POST, etc.) Providers: produzem ou consomem representações de entidades em outros formatos (ex: XML, JSON) JAX-RS usa anotações para configurar os componentes @ApplicationPath na subclasse de Application @Path nos Root resource classes @GET, @POST, etc e @Path nos Resource methods @Produces, @Consumes nos Providers @Context para injetar diversos tipos de contexto do ambiente Web 23
  • 24. Path templates e @PathParam @Path templates
 @Path("/filmes/{imdb}")   Aceita por exemplo: http://abc.com/war/app/filmes/tt0066921 Parâmetros @PathParam
 @Path("/filmes/{imdb}")  
 public  class  FilmesIMDBResource  {        @GET    @Produces("text/xml")
      public  Filme  getFilme(@PathParam("imdb")  String  codigoIMDB)  {  
            return  entity.getFilmeByIMDBCode(codigoIMDB);      }   }   24
  • 25. Diferentes representações de objetos 25 Representação em JSON { "@numero": 145, "nome": "Jeeves", [ "telefone": { "ddd": 11, "numero": 34567890 } ] } Representação em XML <pessoa xmlns="http://pessoa" numero="145"> <nome>Jeeves</nome> <telefone> <ddd>11</ddd> <numero>34567890</numero> </telefone> </pessoa> Pessoa pessoa = new Pessoa(); pessoa.numero = 145; pessoa.nome = "Jeeves"; pessoa.telefone[0] = new Telefone(); pessoa.telefone[0].ddd = 11; pessoa.telefone[0].numero = 34567890; class Pessoa { int numero; String nome; Telefone[] telefones = 
 new Telefone[3]; } class Telefone { int ddd; int numero; } Classes Objetos em Java application/xml application/json
  • 26. JAXB Java API for XML Binding Mapeia classes Java a XML Schema Classes mapeadas a XML Schema (ferramentas xjc e schemagen) Objetos mapeados a documentos XML (através da API javax.xml.bind e operações de serialização em XML (marshalling e unmarshalling) XML Schema Classes Java Binding xjc schemagen Documentos (instâncias XML) Objetos (instâncias Java) Marshalling unmarshal() marshal() 26
  • 27. JAXB: exemplo de classe anotada 27 @XmlSchema(namespace  =  "http://filmes.argonavis.com/")   package  com.argonavis.filmes.generated;   @XmlRootElement   public  class  Sala  implements  Serializable  {              private  List<Assento>  assentos;                        private  String  nome;          private  int  lotacao;          @XmlElementWrapper          @XmlElement(name="assento")          public  List<Assento>  getAssentos()  {                  return  assentos;          }   …   } Sem @XmlElementWrapper <sala>
      <assentos>…</assentos>
      <assentos>…</assentos>
 </sala>   Com @XmlElementWrapper <sala>
      <assentos>
            <assento>…</assento>
            <assento>…</assento>
      </assentos>
 </sala>
  • 28. JAXB Marshal / Unmarshal Unmarshalling = XML àJava JAXBContext  jc  =  
            JAXBContext.newInstance(  "com.argonavis.filmes.gen"  );  
 Unmarshaller  u  =  jc.createUnmarshaller();  
 Filme  filme  =  (Filme)u.unmarshal(  new  File(  "tt1937390.xml"  )   );     Marshalling = Java àXML JAXBContext  jc  =        
            JAXBContext.newInstance(  "com.argonavis.flmes.gen"  );
 Filme  filme  =  ObjectFactory.createFilme();
 filme.setAno(2014);  //  alterando  objeto
 Marshaller  m  =  jc.createMarshaller();  
 m.marshal(  filme,  System.out  ); 28
  • 29. JSON Binding! Substituir o provedor JAXB default por EclipseLink MOXy: javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory Configuração de JAXBContext Map properties = new HashMap(); props.put("eclipselink.media-type", "application/json"); JAXBContext ctx = JAXBContext.newInstance(new Class[] { Produto.class }, props); JSON à Java UnMarshaller u = ctx.createUnMarshaller(); Produto produto= u.unmarshal(new StreamSource(“produto123.json”)); Java à JSON Marshaller m = ctx.createMarshaller(); m.marshal(produto, System.out); 29 Haverá suporte nativo a JSON binding no Java EE 8 (2016)
  • 30. Cliente REST com java.net Cliente HTTP! URL  url  =  new  URL("http://localhost:8080/ctx/app/imdb/tt0066921");   HttpURLConnection  conn  =  (HttpURLConnection)  url.openConnection();   conn.setRequestMethod("GET");   conn.setRequestProperty("Accept",  "application/xml");   if  (conn.getResponseCode()  !=  200)    {        throw  new  RuntimeException("Erro  :  "  +  conn.getResponseCode());   }       BufferedReader  br  =  
        new  BufferedReader(new  InputStreamReader((conn.getInputStream())));   String  linha  =  br.readLine();   System.out.println("Dados  recebidos:  "  +  linha);   conn.disconnect();   JAXBContext  jc  =  JAXBContext.newInstance(Filme.class);   Unmarshaller  u  =  jc.createUnmarshaller();   Filme  filme  =  (Filme)  u.unmarshal(new  StringReader(linha));       System.out.println(filme.getIMDB());  … 30
  • 31. Cliente Jersey* Ainda mais simples ClientConfig  config  =  
        new  DefaultClientConfig();   Client  client  =  Client.create(config);   URI  baseURI  =  
        UriBuilder.fromUri("http://localhost:8080/ctx").build();   WebResource  service  =  client.resource(baseURI);   Filme  filme  =  service.path("app")
                          .path("filme/imdb/tt0066921")
                          .accept(MediaType.APPLICATION_XML)                            .get(Filme.class);   System.out.println(filme.getIMDB());   System.out.println(filme.getTitulo());   System.out.println(filme.getDiretor()); * Existem outras alternativas. Veja RESTEasy 31
  • 32. Cliente mobile (iPhone) REST é melhor alternativa para Web Services que fazem integração como outras plataformas 32 GET  http://192.168.1.25/festival/webapi/filme Glassfish 4.0 1) Cliente REST escrito em Objective-C
 rodando em iOS 7 gera requisição 2) Glassfish gera resposta HTTP com lista de filmes em JSON 3) iPhone extrai dados e preenche UITableView
  • 33. O futuro Java EE 8 promete uma vida menos complexa API de segurança unificada API de transações unificada CDI com papel central em todas as aplicações JSON binding nativo Melhor integração com WebSockets Mas, ... A entropia continua a crescer... + linguagens + bugs + problemas + ameaças + horizontes + iOT + ... a luta continua!
  • 34. Fonte: http://tinyurl.com/7zlytsm "the singularity is near!"Ray Kurzweil helder@argonavis.com.br