SlideShare uma empresa Scribd logo
1 de 73
Baixar para ler offline
CDI, do básico ao
avançado
Thursday, September 5, 13
Alberto Souza
• @alberto_souza
• github.com/asouza
Thursday, September 5, 13
Usar ou criar?
@ManagedBean
public class ProdutosBean {
	 @PostConstruct
	 public void carregaProdutos(){ 	
	 	 ProdutoDAO produtos = new ProdutoDAO();
	 	 produtos.setConnection(ConnectionFactory.createConnection());
	 	 this.lista = dao.lista();
	 }
}
Thursday, September 5, 13
Usar!
@ManagedBean
public class ProdutosBean {
	
	 private ProdutoDAO produtos;
	
	 private ProdutosBean(ProdutoDAO produtos){
	 	 this.produtos = produtos;
	 }
	 @PostConstruct
	 public void carregaProdutos(){	
	 	 this.lista = dao.lista();
	 }
}
Thursday, September 5, 13
Injeção de
Dependências
• JAVAEE 6/7
• CDI 1.0/1.1
• WELD 2
Thursday, September 5, 13
Uso fácil
@ManagedBean
public class ProdutosBean {
	
	 @Inject
	 private ProdutoDAO produtos;
	
	 @PostConstruct
	 public void carregaProdutos(){	
	 	 return dao.lista();
	 }
}
Thursday, September 5, 13
Injeção de
Dependências
• E como configura?
Thursday, September 5, 13
Injeção de
Dependências
• Não precisa mais
Thursday, September 5, 13
Outro exemplo
class ProdutoDAO{
	 @Inject
	 private EntityManager em;
	
	 public List<Produto> lista(){
	 	 return em.createQuery("select p from Produto p");
	 }
}
Thursday, September 5, 13
Criação de
EntityManager
	 	 EntityManagerFactory emf = Persistence.
	 	 	 	 createEntityManagerFactory("loja");
	 	 EntityManager em = emf.createEntityManager();
Thursday, September 5, 13
Tem que ensinar
class EntityManagerProducer{
	
private EntityManagerFactory emf =
Persistence.createEntityManagerFactory("loja");
	
	 @Produces
	 public EntityManager create(){
	 	 return factory.createEntityManager();
	 }
}
Thursday, September 5, 13
Escopo?
class EntityManagerProducer{
	
private EntityManagerFactory emf =
Persistence.createEntityManagerFactory("loja");
	
	 @Produces
	 @RequestScoped
	 public EntityManager create(){
	 	 return factory.createEntityManager();
	 }
}
Thursday, September 5, 13
Escopo?
class EntityManagerProducer{
	
private EntityManagerFactory emf =
Persistence.createEntityManagerFactory("loja");
	 //outro método aqui...
	 public void close(@Disposes EntityManager entityManager){
	 	 entityManager.close();
	 }
}
Thursday, September 5, 13
Qual é o remetente?
public class FinalizadorDeCompra{
	
	 private String remetente;
	
	 public void envia(){
	 	 mailer.send(remente,...);
	 }
}
Thursday, September 5, 13
Trocar a injeção de
String?
public class FinalizadorDeCompra{
	
	 @Inject
	 private String remetente;
	
	 public void envia(){
	 	 mailer.send(remente,...);
	 }
}
Thursday, September 5, 13
Só quero para
determinada String
public class FinalizadorDeCompra{
	
	 @Inject @RemetenteCompra
	 private String remetente;
	
	 public void envia(){
	 	 mailer.send(remente,...);
	 }
}
Thursday, September 5, 13
Qualifier
//outras annotations chatas
@Qualifier
@interface RemetenteCompra{
	
}
Thursday, September 5, 13
Qualifier
@ApplicationScoped
class RemetentesProducer {
	
	 @Produces
	 @RemetenteCompra
	 public String remetenteCompra(){		
	 	 return properties.getProperty("remetente.compra");
	 }
	
	 @Produces
	 @RemetenteNewsletter
	 public String remetenteNewsletter(){	 	
	 	 return properties.getProperty("remetente.newsletter");
	 }	
}
Thursday, September 5, 13
Indo além
• VRaptor CDI e integração com o
Container
Thursday, September 5, 13
Injeção de coisas do
container
• Quero usar um EJB, EntityManager...
Thursday, September 5, 13
Injeção de coisas do
container
@Component
public class ProdutoDAO {
@Inject
	 private final EntityManager entityManager;
	 public void salva(Produto produto) {
	 	 entityManager.persist(produto);
	 }
Thursday, September 5, 13
Injeção de coisas do
container
@Stateless
@Component
public class ProdutoDAO {
@Inject
	 private final EntityManager entityManager;
	 public void salva(Produto produto) {
	 	 entityManager.persist(produto);
	 }
Thursday, September 5, 13
Injeção de coisas do
container
@Resource
public class ProdutosController {
//@EJB
	 @Inject
	 private ProdutoDAO produtoDAO;
...
}
Thursday, September 5, 13
EJB?
• Por sinal o DAO é um EJB porque?
Thursday, September 5, 13
EJB?
@Component
public class ProdutoDAO {
@Inject
	 private final EntityManager entityManager;
@Transactional
	 public void salva(Produto produto) {
	 	 entityManager.persist(produto);
	 }
Thursday, September 5, 13
Exemplo de uso
• Coloco no interceptor e tá tudo certo!
Thursday, September 5, 13
Componente padrão
@RequestScoped
public class DefaultPathResolver implements PathResolver {
	
	 public String pathFor(ResourceMethod method) {
	 	 String format = resolver.getAcceptFormat();
	 	 String suffix = "";
	 	 if (format != null && !format.equals("html")) {
	 	 	 suffix = "." + format;
	 	 }
	 	 //WEB-INF/jsp/controller/metodo.jsp
String name = method.getResource().getType().getSimpleName();
String folderName = extractControllerFromName(name);
	 	 return getPrefix() + folderName + "/" +
method.getMethod().getName() + suffix
	 	 	 	 + "."+getExtension();
	 }
Thursday, September 5, 13
Componente
customizado
class CustomPathResolver implements PathResolver{
	 public String pathFor(ResourceMethod method) {
	 	 String format = resolver.getAcceptFormat();
	 	 String suffix = "";
	 	 if (format != null && !format.equals("html")) {
	 	 	 suffix = "." + format;
	 	 }
	 	 //WEB-INF/resources/controller/metodo.jsp
String name = method.getResource().getType().getSimpleName();
String folderName = extractControllerFromName(name);
	 	 return "WEB-INF/resources" + folderName + "/" +
method.getMethod().getName() + suffix
	 	 	 	 + "."+getExtension();
	 }	
}
Thursday, September 5, 13
Alternative
@Alternative
class CustomPathResolver implements PathResolver{
	 public String pathFor(ResourceMethod method) {
	 	 String format = resolver.getAcceptFormat();
	 	 String suffix = "";
	 	 if (format != null && !format.equals("html")) {
	 	 	 suffix = "." + format;
	 	 }
	 	 //WEB-INF/jsp/controller/metodo.jsp
String name = method.getResource().getType().getSimpleName();
String folderName = extractControllerFromName(name);
	 	 return "WEB-INF/resources" + folderName + "/" +
method.getMethod().getName() + suffix
	 	 	 	 + "."+getExtension();
	 }	
}
Thursday, September 5, 13
Registra no beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<alternatives>
<class>br.com.caelum.vraptor.view.CustomPathResolver</class>
</alternatives>
</beans>
Thursday, September 5, 13
ilhazinha
• Alternative habilitado só no bean archive
Thursday, September 5, 13
ilhazinha
• VRaptor não enxergava
Thursday, September 5, 13
Prioridade
@Alternative
@Priority(Interceptor.Priority.APPLICATION)
class CustomPathResolver implements PathResolver{
	 public String pathFor(ResourceMethod method) {
	 	 String format = resolver.getAcceptFormat();
	 	 String suffix = "";
	 	 if (format != null && !format.equals("html")) {
	 	 	 suffix = "." + format;
	 	 }
	 	 //WEB-INF/jsp/controller/metodo.jsp
String name = method.getResource().getType().getSimpleName();
String folderName = extractControllerFromName(name);
	 	 return "WEB-INF/resources" + folderName + "/" +
method.getMethod().getName() + suffix
	 	 	 	 + "."+getExtension();
	 }	
}
Thursday, September 5, 13
Prioridade
• Podemos sempre sobreescrever!
Thursday, September 5, 13
Servidor já injeta
Request
• Request doVRaptor é modificado
Thursday, September 5, 13
Aproveita o que já
existe
public class VRaptorRequest implements
MutableRequest,HttpServletRequest {
	 private final Hashtable<String, String[]> extraParameters = new
Hashtable<String, String[]>();
//qual que ele vai injetar?	
	 @Inject
	 private HttpServletRequest request;
}
Thursday, September 5, 13
Aproveitamos o
existente
@Decorator
public class VRaptorRequest implements MutableRequest,HttpServletRequest
{
	 @Delegate
	 private HttpServletRequest delegate;
	 @Override
	 public String getParameter(String name) {
	 	 if (extraParameters.containsKey(name)) {
	 	 	 String[] values = extraParameters.get(name);
	 	 	 if (values.length == 1) {
	 	 	 	 return values[0];
	 	 	 } else {
	 	 	 	 return Arrays.toString(values);
	 	 	 }
	 	 }
	 	 return delegate.getParameter(name);
	 }
Thursday, September 5, 13
Configuramos
<decorators>
<class>br.com.caelum.vraptor.http.VRaptorRequest</class>
</decorators>
Thursday, September 5, 13
Priority
• Pode usar Priority também!
Thursday, September 5, 13
Injetar Requests
public class DefaultFormatResolver implements FormatResolver {
	 private final HttpServletRequest request;
	 private final AcceptHeaderToFormat acceptHeaderToFormat;
	 @Inject
	 public DefaultFormatResolver(HttpServletRequest request,
AcceptHeaderToFormat acceptHeaderToFormat) {
	 	 this.request = request;
	 	 this.acceptHeaderToFormat = acceptHeaderToFormat;
	 }
	
	 public String getAcceptFormat() {
	 	 String format = request.getParameter("_format");
	 	 if (format != null) {
	 	 	 return format;
	 	 }
	 	 format = request.getHeader("Accept");
Thursday, September 5, 13
Trocar o request o
tempo todo
@Inject
	 private CDIHttpServletRequestFactory requestFactory;
	 @Inject
	 private CDIHttpSessionFactory sessionFactory;	
public <T> T provideForRequest(RequestInfo request) {
	 	 //configurando produtores
	 	 requestFactory.setRequest(request);
	 	 sessionFactory.setSession(request);
	 	 return execution.insideRequest(container);
	 }
Thursday, September 5, 13
Notifica o povo
	 @Inject
	 private Event<HttpServletRequest> eventosDeRequest;
	
	 public <T> T provideForRequest(RequestInfo requestInfo, Execution<T>
execution) {
	 	 //configurando produtores
	 	 eventosDeRequest.fire(requestInfo.getRequest());
	 	 return execution.insideRequest(container);
	 }
Thursday, September 5, 13
Quero ser notificado
public class CDIHttpServletRequestFactory implements
ComponentFactory<HttpServletRequest>{
	
	 private HttpServletRequest request;
	 public void handle(@Observes HttpServletRequest request){
	 	 this.request = request;
	 	
	 }
	
	 public HttpServletRequest getInstance(){
	 	 return request;
	 }
}
Thursday, September 5, 13
VRaptor já tem
@RequestScoped
public @interface RequestScoped {
}
Thursday, September 5, 13
Eu sou você!
@Stereotype
@javax.enterprise.context.RequestScoped
@Named
public @interface RequestScoped {
}
Thursday, September 5, 13
VRaptor não usa
@Inject
@Resource
public class ProdutoDAO {
	 private final EntityManager entityManager;
	 public CDIResourceComponent(EntityManager entityManager) {
	 	 this.entityManager = entityManager;
	 }
}
Thursday, September 5, 13
Oxi, sem @Inject?
• Cadê o @Inject?
Thursday, September 5, 13
Pedimos a ele para
colocar
public class AddInjectToConstructorExtension implements Extension{
	 public void processAnnotatedType(@Observes final ProcessAnnotatedType
pat) {
	 	 AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder();
	 	 builder.readFromType(pat.getAnnotatedType());
	 	 if (hasArgsConstructorAndNoInjection) {
	 	 	 Constructor constructor = constructors.get(0);
	 	 	 //pulo do gato
	 	 	 builder.addToConstructor(constructor,new
AnnotationLiteral<Inject>() {});
	 	 	 //trocando a configuração original
	 	 	 pat.setAnnotatedType(builder.create());
	 	 }
	 }
Thursday, September 5, 13
VRaptor já tem
Factories
@Component
public class CDIComponent implements ComponentFactory {
	 private final MyRequestComponent component;
	
	 public CDIComponent(MyRequestComponent component) {
	 	 this.component = component;
	 }
	 public ComponentToBeProduced getInstance() {		
	 	 return new ComponentToBeProduced();
	 }
}
Thursday, September 5, 13
Oxi, e o @Produces?
• E o @Produces?
Thursday, September 5, 13
@Produces em cima
do método
public class ComponentFactoryExtension implements Extension{
	 public void addProduces(@Observes ProcessAnnotatedType pat) {
	 	 builder.readFromType(pat.getAnnotatedType());
	 	 if (ComponentFactory.class.isAssignableFrom(javaClass)) {
	 	 	 builder.addToMethod(getInstance,new ProducesAnnotion());
	 	 }
	 }
}
class ProducesAnnotion extends AnnotationLiteral<Produces>{
	
}
Thursday, September 5, 13
Configura extensão
• META-INF/services/
javax.enterprise.inject.spi.Extension
Thursday, September 5, 13
Configura extensão
br.com.caelum.vraptor.ioc.cdi.extensions.AddInjectToConstructorExtensi
on
br.com.caelum.vraptor.ioc.cdi.extensions.ComponentFactoryExtension
Thursday, September 5, 13
E para testar?
• E para testar?
Thursday, September 5, 13
Arquillian
@RunWith(Arquillian.class)
public class CDIProviderRegisteringComponentsTest {
	
	 @Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(DefaultPathResolver.class)
.addAsManifestResource(EmptyAsset.INSTANCE,
"beans.xml");
}
Thursday, September 5, 13
Arquillian
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addPackage("com.thoughtworks.xstream")
}
Thursday, September 5, 13
Problemas
• Falta de controle sobre o container
Thursday, September 5, 13
DeltaSpike
	 	 cdiContainer = CdiContainerLoader.getCdiContainer();
	 	 cdiContainer.boot();
Thursday, September 5, 13
Controle do escopo
	 public void start(Class<? extends Annotation> scope) {
	 	 cdiContainer.getContextControl().startContext(scope);
	 }
Thursday, September 5, 13
Controle do escopo
	 	 	 	 start(RequestScoped.class);
	 	 	 	 start(SessionScoped.class);
	 	 	 	 	 //logica
	 	 	 	 stop(SessionScoped.class);
	 	 	 	 stop(RequestScoped.class);
Thursday, September 5, 13
Últimos detalhes
• Funcionalidade com muitos passos
Thursday, September 5, 13
Funcionalidade com
vários passos
@Controller
public class PagamentoController implements Serializable{
private InformacoesDoComprador info = new
InformacoesDoComprador();
	 @Inject
	 public PagamentoController(Result result) {
	 	 super();
	 	 this.result = result;
	 }
	 @Post("compra/endereco")
	 public void associaEndereco(String endereco){
	 	 info.setEnderecoDeEntrega(endereco);	 	
	 }
Thursday, September 5, 13
Funcionalidade com
vários passos
@Controller
public class PagamentoController implements Serializable{
//resto que não coube e eu não soube ajeitar.
	 @Post("compra/endereco")
	 public void associaEndereco(String endereco){
	 	 info.setEnderecoDeEntrega(endereco);	 	
	 }
	 @Post("compra/cartao")
	 public void associaCartao(String numero){
//como mantém as informações do comprador?
	 	 info.setNumeroDoCartao(numero);
	 	 result.include("dadosComprador",info);
	 }
}
Thursday, September 5, 13
Como implementar?
• 2 Maneiras?
Thursday, September 5, 13
Exemplo de
implementação
• Stateless?
Thursday, September 5, 13
Outro exemplo
• Stateful?
Thursday, September 5, 13
Meio termo
• Mangue moderado!
Thursday, September 5, 13
Conversation
@Controller
@ConversationScoped
public class PagamentoController implements Serializable{
@Inject
private Conversation conversation;
	 @Post("compra/endereco")
	 public void associaEndereco(String endereco){
conversation.begin();
	 	 info.setEnderecoDeEntrega(endereco);	 	
result.redirectTo("/compra/cartao?
cid="+conversation.getId());
	 }
Thursday, September 5, 13
Conversation
@Controller
@ConversationScoped
public class PagamentoController implements Serializable{
@Inject
private Conversation conversation;
	 @Post("compra/cartao")
	 public void associaCartao(String numero){
	 	 info.setNumeroDoCartao(numero);
//grava e vamo aí..
	 	 conversation.end();
	 	 result.include("dadosComprador",info);
	 }
Thursday, September 5, 13
Conversation
@Controller
@ConversationScoped
public class PagamentoController implements Serializable{
	 @Inject
	 public PagamentoController(Result result) {
	 	 super();
	 	 this.result = result;
	 }
Thursday, September 5, 13
E esse result?
• O Result tem que ser passivavel :(
Thursday, September 5, 13
Não mais :)
@Controller
@ConversationScoped
public class PagamentoController implements Serializable{
	 @Inject
	 public PagamentoController(@TransientReference Result result) {
	 	 super();
	 	 this.result = result;
	 }
Thursday, September 5, 13
Valeu!
@alberto_souza
github.com/asouza
Thursday, September 5, 13

Mais conteúdo relacionado

Mais procurados

Code to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern ApplicationsCode to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern ApplicationsCaleb Jenkins
 
Java Libraries You Can't Afford to Miss
Java Libraries You Can't Afford to MissJava Libraries You Can't Afford to Miss
Java Libraries You Can't Afford to MissAndres Almiray
 
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...7mind
 
Padroes Projeto
Padroes ProjetoPadroes Projeto
Padroes Projetolcbj
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized projectFabio Collini
 
Demystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDemystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDanny Preussler
 
PROMAND 2014 project structure
PROMAND 2014 project structurePROMAND 2014 project structure
PROMAND 2014 project structureAlexey Buzdin
 
Automated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xAutomated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xTatsuya Maki
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS ProgrammersDavid Rodenas
 
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)Danny Preussler
 
Anton Minashkin Dagger 2 light
Anton Minashkin Dagger 2 lightAnton Minashkin Dagger 2 light
Anton Minashkin Dagger 2 lightMichael Pustovit
 
Contextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEContextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEMarcos Placona
 
JavaFX for Business Application Developers
JavaFX for Business Application DevelopersJavaFX for Business Application Developers
JavaFX for Business Application DevelopersMichael Heinrichs
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKFabio Collini
 
Data binding в массы! (1.2)
Data binding в массы! (1.2)Data binding в массы! (1.2)
Data binding в массы! (1.2)Yurii Kotov
 
Secret unit testing tools no one ever told you about
Secret unit testing tools no one ever told you aboutSecret unit testing tools no one ever told you about
Secret unit testing tools no one ever told you aboutDror Helper
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsJeff Durta
 

Mais procurados (20)

Code to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern ApplicationsCode to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern Applications
 
Java Libraries You Can't Afford to Miss
Java Libraries You Can't Afford to MissJava Libraries You Can't Afford to Miss
Java Libraries You Can't Afford to Miss
 
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
 
継承だろJK
継承だろJK継承だろJK
継承だろJK
 
Padroes Projeto
Padroes ProjetoPadroes Projeto
Padroes Projeto
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
Demystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDemystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and Toothpick
 
PROMAND 2014 project structure
PROMAND 2014 project structurePROMAND 2014 project structure
PROMAND 2014 project structure
 
Automated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xAutomated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.x
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS Programmers
 
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
 
Anton Minashkin Dagger 2 light
Anton Minashkin Dagger 2 lightAnton Minashkin Dagger 2 light
Anton Minashkin Dagger 2 light
 
Contextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEContextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DE
 
JavaFX for Business Application Developers
JavaFX for Business Application DevelopersJavaFX for Business Application Developers
JavaFX for Business Application Developers
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UK
 
Guice2.0
Guice2.0Guice2.0
Guice2.0
 
Data binding в массы! (1.2)
Data binding в массы! (1.2)Data binding в массы! (1.2)
Data binding в массы! (1.2)
 
Unit Testing in Kotlin
Unit Testing in KotlinUnit Testing in Kotlin
Unit Testing in Kotlin
 
Secret unit testing tools no one ever told you about
Secret unit testing tools no one ever told you aboutSecret unit testing tools no one ever told you about
Secret unit testing tools no one ever told you about
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applications
 

Semelhante a CDI do básico ao avançado

Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long jaxconf
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)James Titcumb
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)James Titcumb
 
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、GaelykでハンズオンTsuyoshi Yamamoto
 
ActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group PresentationActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group Presentationipolevoy
 
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)James Titcumb
 
Тарас Олексин - Sculpt! Your! Tests!
Тарас Олексин  - Sculpt! Your! Tests!Тарас Олексин  - Sculpt! Your! Tests!
Тарас Олексин - Sculpt! Your! Tests!DataArt
 
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013swentel
 
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...Guillaume Laforge
 
Integration patterns in AEM 6
Integration patterns in AEM 6Integration patterns in AEM 6
Integration patterns in AEM 6Yuval Ararat
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5Darren Craig
 
Great Developers Steal
Great Developers StealGreat Developers Steal
Great Developers StealBen Scofield
 
FluentLeniumで困った話
FluentLeniumで困った話FluentLeniumで困った話
FluentLeniumで困った話Yuuki Ooguro
 
vfsStream - effective filesystem mocking
vfsStream - effective filesystem mocking vfsStream - effective filesystem mocking
vfsStream - effective filesystem mocking Sebastian Marek
 
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof MenżykPROIDEA
 
Groovy for Java Developers
Groovy for Java DevelopersGroovy for Java Developers
Groovy for Java DevelopersAndres Almiray
 

Semelhante a CDI do básico ao avançado (20)

Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long
 
VRaptor 4 - JavaOne
VRaptor 4 - JavaOneVRaptor 4 - JavaOne
VRaptor 4 - JavaOne
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
 
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
 
ActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group PresentationActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group Presentation
 
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
 
Angular 2 introduction
Angular 2 introductionAngular 2 introduction
Angular 2 introduction
 
Тарас Олексин - Sculpt! Your! Tests!
Тарас Олексин  - Sculpt! Your! Tests!Тарас Олексин  - Sculpt! Your! Tests!
Тарас Олексин - Sculpt! Your! Tests!
 
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
 
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
 
Integration patterns in AEM 6
Integration patterns in AEM 6Integration patterns in AEM 6
Integration patterns in AEM 6
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
Great Developers Steal
Great Developers StealGreat Developers Steal
Great Developers Steal
 
FluentLeniumで困った話
FluentLeniumで困った話FluentLeniumで困った話
FluentLeniumで困った話
 
vfsStream - effective filesystem mocking
vfsStream - effective filesystem mocking vfsStream - effective filesystem mocking
vfsStream - effective filesystem mocking
 
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
 
Be pragmatic, be SOLID
Be pragmatic, be SOLIDBe pragmatic, be SOLID
Be pragmatic, be SOLID
 
Groovy for Java Developers
Groovy for Java DevelopersGroovy for Java Developers
Groovy for Java Developers
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
 

Último

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 

Último (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 

CDI do básico ao avançado

  • 1. CDI, do básico ao avançado Thursday, September 5, 13
  • 2. Alberto Souza • @alberto_souza • github.com/asouza Thursday, September 5, 13
  • 3. Usar ou criar? @ManagedBean public class ProdutosBean { @PostConstruct public void carregaProdutos(){ ProdutoDAO produtos = new ProdutoDAO(); produtos.setConnection(ConnectionFactory.createConnection()); this.lista = dao.lista(); } } Thursday, September 5, 13
  • 4. Usar! @ManagedBean public class ProdutosBean { private ProdutoDAO produtos; private ProdutosBean(ProdutoDAO produtos){ this.produtos = produtos; } @PostConstruct public void carregaProdutos(){ this.lista = dao.lista(); } } Thursday, September 5, 13
  • 5. Injeção de Dependências • JAVAEE 6/7 • CDI 1.0/1.1 • WELD 2 Thursday, September 5, 13
  • 6. Uso fácil @ManagedBean public class ProdutosBean { @Inject private ProdutoDAO produtos; @PostConstruct public void carregaProdutos(){ return dao.lista(); } } Thursday, September 5, 13
  • 7. Injeção de Dependências • E como configura? Thursday, September 5, 13
  • 8. Injeção de Dependências • Não precisa mais Thursday, September 5, 13
  • 9. Outro exemplo class ProdutoDAO{ @Inject private EntityManager em; public List<Produto> lista(){ return em.createQuery("select p from Produto p"); } } Thursday, September 5, 13
  • 10. Criação de EntityManager EntityManagerFactory emf = Persistence. createEntityManagerFactory("loja"); EntityManager em = emf.createEntityManager(); Thursday, September 5, 13
  • 11. Tem que ensinar class EntityManagerProducer{ private EntityManagerFactory emf = Persistence.createEntityManagerFactory("loja"); @Produces public EntityManager create(){ return factory.createEntityManager(); } } Thursday, September 5, 13
  • 12. Escopo? class EntityManagerProducer{ private EntityManagerFactory emf = Persistence.createEntityManagerFactory("loja"); @Produces @RequestScoped public EntityManager create(){ return factory.createEntityManager(); } } Thursday, September 5, 13
  • 13. Escopo? class EntityManagerProducer{ private EntityManagerFactory emf = Persistence.createEntityManagerFactory("loja"); //outro método aqui... public void close(@Disposes EntityManager entityManager){ entityManager.close(); } } Thursday, September 5, 13
  • 14. Qual é o remetente? public class FinalizadorDeCompra{ private String remetente; public void envia(){ mailer.send(remente,...); } } Thursday, September 5, 13
  • 15. Trocar a injeção de String? public class FinalizadorDeCompra{ @Inject private String remetente; public void envia(){ mailer.send(remente,...); } } Thursday, September 5, 13
  • 16. Só quero para determinada String public class FinalizadorDeCompra{ @Inject @RemetenteCompra private String remetente; public void envia(){ mailer.send(remente,...); } } Thursday, September 5, 13
  • 17. Qualifier //outras annotations chatas @Qualifier @interface RemetenteCompra{ } Thursday, September 5, 13
  • 18. Qualifier @ApplicationScoped class RemetentesProducer { @Produces @RemetenteCompra public String remetenteCompra(){ return properties.getProperty("remetente.compra"); } @Produces @RemetenteNewsletter public String remetenteNewsletter(){ return properties.getProperty("remetente.newsletter"); } } Thursday, September 5, 13
  • 19. Indo além • VRaptor CDI e integração com o Container Thursday, September 5, 13
  • 20. Injeção de coisas do container • Quero usar um EJB, EntityManager... Thursday, September 5, 13
  • 21. Injeção de coisas do container @Component public class ProdutoDAO { @Inject private final EntityManager entityManager; public void salva(Produto produto) { entityManager.persist(produto); } Thursday, September 5, 13
  • 22. Injeção de coisas do container @Stateless @Component public class ProdutoDAO { @Inject private final EntityManager entityManager; public void salva(Produto produto) { entityManager.persist(produto); } Thursday, September 5, 13
  • 23. Injeção de coisas do container @Resource public class ProdutosController { //@EJB @Inject private ProdutoDAO produtoDAO; ... } Thursday, September 5, 13
  • 24. EJB? • Por sinal o DAO é um EJB porque? Thursday, September 5, 13
  • 25. EJB? @Component public class ProdutoDAO { @Inject private final EntityManager entityManager; @Transactional public void salva(Produto produto) { entityManager.persist(produto); } Thursday, September 5, 13
  • 26. Exemplo de uso • Coloco no interceptor e tá tudo certo! Thursday, September 5, 13
  • 27. Componente padrão @RequestScoped public class DefaultPathResolver implements PathResolver { public String pathFor(ResourceMethod method) { String format = resolver.getAcceptFormat(); String suffix = ""; if (format != null && !format.equals("html")) { suffix = "." + format; } //WEB-INF/jsp/controller/metodo.jsp String name = method.getResource().getType().getSimpleName(); String folderName = extractControllerFromName(name); return getPrefix() + folderName + "/" + method.getMethod().getName() + suffix + "."+getExtension(); } Thursday, September 5, 13
  • 28. Componente customizado class CustomPathResolver implements PathResolver{ public String pathFor(ResourceMethod method) { String format = resolver.getAcceptFormat(); String suffix = ""; if (format != null && !format.equals("html")) { suffix = "." + format; } //WEB-INF/resources/controller/metodo.jsp String name = method.getResource().getType().getSimpleName(); String folderName = extractControllerFromName(name); return "WEB-INF/resources" + folderName + "/" + method.getMethod().getName() + suffix + "."+getExtension(); } } Thursday, September 5, 13
  • 29. Alternative @Alternative class CustomPathResolver implements PathResolver{ public String pathFor(ResourceMethod method) { String format = resolver.getAcceptFormat(); String suffix = ""; if (format != null && !format.equals("html")) { suffix = "." + format; } //WEB-INF/jsp/controller/metodo.jsp String name = method.getResource().getType().getSimpleName(); String folderName = extractControllerFromName(name); return "WEB-INF/resources" + folderName + "/" + method.getMethod().getName() + suffix + "."+getExtension(); } } Thursday, September 5, 13
  • 30. Registra no beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans> <alternatives> <class>br.com.caelum.vraptor.view.CustomPathResolver</class> </alternatives> </beans> Thursday, September 5, 13
  • 31. ilhazinha • Alternative habilitado só no bean archive Thursday, September 5, 13
  • 32. ilhazinha • VRaptor não enxergava Thursday, September 5, 13
  • 33. Prioridade @Alternative @Priority(Interceptor.Priority.APPLICATION) class CustomPathResolver implements PathResolver{ public String pathFor(ResourceMethod method) { String format = resolver.getAcceptFormat(); String suffix = ""; if (format != null && !format.equals("html")) { suffix = "." + format; } //WEB-INF/jsp/controller/metodo.jsp String name = method.getResource().getType().getSimpleName(); String folderName = extractControllerFromName(name); return "WEB-INF/resources" + folderName + "/" + method.getMethod().getName() + suffix + "."+getExtension(); } } Thursday, September 5, 13
  • 34. Prioridade • Podemos sempre sobreescrever! Thursday, September 5, 13
  • 35. Servidor já injeta Request • Request doVRaptor é modificado Thursday, September 5, 13
  • 36. Aproveita o que já existe public class VRaptorRequest implements MutableRequest,HttpServletRequest { private final Hashtable<String, String[]> extraParameters = new Hashtable<String, String[]>(); //qual que ele vai injetar? @Inject private HttpServletRequest request; } Thursday, September 5, 13
  • 37. Aproveitamos o existente @Decorator public class VRaptorRequest implements MutableRequest,HttpServletRequest { @Delegate private HttpServletRequest delegate; @Override public String getParameter(String name) { if (extraParameters.containsKey(name)) { String[] values = extraParameters.get(name); if (values.length == 1) { return values[0]; } else { return Arrays.toString(values); } } return delegate.getParameter(name); } Thursday, September 5, 13
  • 39. Priority • Pode usar Priority também! Thursday, September 5, 13
  • 40. Injetar Requests public class DefaultFormatResolver implements FormatResolver { private final HttpServletRequest request; private final AcceptHeaderToFormat acceptHeaderToFormat; @Inject public DefaultFormatResolver(HttpServletRequest request, AcceptHeaderToFormat acceptHeaderToFormat) { this.request = request; this.acceptHeaderToFormat = acceptHeaderToFormat; } public String getAcceptFormat() { String format = request.getParameter("_format"); if (format != null) { return format; } format = request.getHeader("Accept"); Thursday, September 5, 13
  • 41. Trocar o request o tempo todo @Inject private CDIHttpServletRequestFactory requestFactory; @Inject private CDIHttpSessionFactory sessionFactory; public <T> T provideForRequest(RequestInfo request) { //configurando produtores requestFactory.setRequest(request); sessionFactory.setSession(request); return execution.insideRequest(container); } Thursday, September 5, 13
  • 42. Notifica o povo @Inject private Event<HttpServletRequest> eventosDeRequest; public <T> T provideForRequest(RequestInfo requestInfo, Execution<T> execution) { //configurando produtores eventosDeRequest.fire(requestInfo.getRequest()); return execution.insideRequest(container); } Thursday, September 5, 13
  • 43. Quero ser notificado public class CDIHttpServletRequestFactory implements ComponentFactory<HttpServletRequest>{ private HttpServletRequest request; public void handle(@Observes HttpServletRequest request){ this.request = request; } public HttpServletRequest getInstance(){ return request; } } Thursday, September 5, 13
  • 44. VRaptor já tem @RequestScoped public @interface RequestScoped { } Thursday, September 5, 13
  • 45. Eu sou você! @Stereotype @javax.enterprise.context.RequestScoped @Named public @interface RequestScoped { } Thursday, September 5, 13
  • 46. VRaptor não usa @Inject @Resource public class ProdutoDAO { private final EntityManager entityManager; public CDIResourceComponent(EntityManager entityManager) { this.entityManager = entityManager; } } Thursday, September 5, 13
  • 47. Oxi, sem @Inject? • Cadê o @Inject? Thursday, September 5, 13
  • 48. Pedimos a ele para colocar public class AddInjectToConstructorExtension implements Extension{ public void processAnnotatedType(@Observes final ProcessAnnotatedType pat) { AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder(); builder.readFromType(pat.getAnnotatedType()); if (hasArgsConstructorAndNoInjection) { Constructor constructor = constructors.get(0); //pulo do gato builder.addToConstructor(constructor,new AnnotationLiteral<Inject>() {}); //trocando a configuração original pat.setAnnotatedType(builder.create()); } } Thursday, September 5, 13
  • 49. VRaptor já tem Factories @Component public class CDIComponent implements ComponentFactory { private final MyRequestComponent component; public CDIComponent(MyRequestComponent component) { this.component = component; } public ComponentToBeProduced getInstance() { return new ComponentToBeProduced(); } } Thursday, September 5, 13
  • 50. Oxi, e o @Produces? • E o @Produces? Thursday, September 5, 13
  • 51. @Produces em cima do método public class ComponentFactoryExtension implements Extension{ public void addProduces(@Observes ProcessAnnotatedType pat) { builder.readFromType(pat.getAnnotatedType()); if (ComponentFactory.class.isAssignableFrom(javaClass)) { builder.addToMethod(getInstance,new ProducesAnnotion()); } } } class ProducesAnnotion extends AnnotationLiteral<Produces>{ } Thursday, September 5, 13
  • 54. E para testar? • E para testar? Thursday, September 5, 13
  • 55. Arquillian @RunWith(Arquillian.class) public class CDIProviderRegisteringComponentsTest { @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(DefaultPathResolver.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } Thursday, September 5, 13
  • 56. Arquillian public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addPackage("com.thoughtworks.xstream") } Thursday, September 5, 13
  • 57. Problemas • Falta de controle sobre o container Thursday, September 5, 13
  • 58. DeltaSpike cdiContainer = CdiContainerLoader.getCdiContainer(); cdiContainer.boot(); Thursday, September 5, 13
  • 59. Controle do escopo public void start(Class<? extends Annotation> scope) { cdiContainer.getContextControl().startContext(scope); } Thursday, September 5, 13
  • 60. Controle do escopo start(RequestScoped.class); start(SessionScoped.class); //logica stop(SessionScoped.class); stop(RequestScoped.class); Thursday, September 5, 13
  • 61. Últimos detalhes • Funcionalidade com muitos passos Thursday, September 5, 13
  • 62. Funcionalidade com vários passos @Controller public class PagamentoController implements Serializable{ private InformacoesDoComprador info = new InformacoesDoComprador(); @Inject public PagamentoController(Result result) { super(); this.result = result; } @Post("compra/endereco") public void associaEndereco(String endereco){ info.setEnderecoDeEntrega(endereco); } Thursday, September 5, 13
  • 63. Funcionalidade com vários passos @Controller public class PagamentoController implements Serializable{ //resto que não coube e eu não soube ajeitar. @Post("compra/endereco") public void associaEndereco(String endereco){ info.setEnderecoDeEntrega(endereco); } @Post("compra/cartao") public void associaCartao(String numero){ //como mantém as informações do comprador? info.setNumeroDoCartao(numero); result.include("dadosComprador",info); } } Thursday, September 5, 13
  • 64. Como implementar? • 2 Maneiras? Thursday, September 5, 13
  • 67. Meio termo • Mangue moderado! Thursday, September 5, 13
  • 68. Conversation @Controller @ConversationScoped public class PagamentoController implements Serializable{ @Inject private Conversation conversation; @Post("compra/endereco") public void associaEndereco(String endereco){ conversation.begin(); info.setEnderecoDeEntrega(endereco); result.redirectTo("/compra/cartao? cid="+conversation.getId()); } Thursday, September 5, 13
  • 69. Conversation @Controller @ConversationScoped public class PagamentoController implements Serializable{ @Inject private Conversation conversation; @Post("compra/cartao") public void associaCartao(String numero){ info.setNumeroDoCartao(numero); //grava e vamo aí.. conversation.end(); result.include("dadosComprador",info); } Thursday, September 5, 13
  • 70. Conversation @Controller @ConversationScoped public class PagamentoController implements Serializable{ @Inject public PagamentoController(Result result) { super(); this.result = result; } Thursday, September 5, 13
  • 71. E esse result? • O Result tem que ser passivavel :( Thursday, September 5, 13
  • 72. Não mais :) @Controller @ConversationScoped public class PagamentoController implements Serializable{ @Inject public PagamentoController(@TransientReference Result result) { super(); this.result = result; } Thursday, September 5, 13