TUTORIAL JAVA + FLEX NA PRÁTICA 7/6 – Bônus

Esse artigo é continuação do
TUTORIAL JAVA + FLEX NA PRÁTICA 1/6
TUTORIAL JAVA + FLEX NA PRÁTICA 2/6
TUTORIAL JAVA + FLEX NA PRÁTICA 3/6
TUTORIAL JAVA + FLEX NA PRÁTICA 4/6
TUTORIAL JAVA + FLEX NA PRÁTICA 5/6
TUTORIAL JAVA + FLEX NA PRÁTICA 6/6

Não definitivamente você não está delirando e nem eu esqueci conceitos simples da matemática, realmente criei mais um tutorial, a 7/6, o que estou considerando Bônus, para fazer algumas modificações e implementar algumas funcionalidades.

Antes gostaria de agradecer pela participação do pessoal, muitos entenderam o objetivo do tutorial e com certeza fizeram bom proveito, fiquei sabendo este mês de julho que alguns mudaram a forma de trabalhar com Java + flex através deste tutorial :P . Através do mesmo recebi ótimos contatos e oportunidades profissionais, porém, como sempre há alguém que quer mais e gostaria de mais um empurram, então vamos direto ao assunto que tempo é dinheiro.

Essa parte vamos tratar mais de relacionamentos entre tabelas, como tratar esses relacionamentos no Flex e como mostrar mais de um objeto no datagrid... vamos a prática.

Implementação no Java

Assim como fizemos na nossa classe Estado vamos criar nossa Classe Cidade, classe essa que fará o relacionamento mais comum e a dúvida mais comum depois que você começa a programar, vamos ao código:

Cidade.java

JAVA:
  1. @Table(name="cidade")
  2. public class Cidade {
  3.  
  4. @Id @GeneratedValue(strategy = GenerationType.AUTO)
  5. private long idCidade;
  6.  
  7. @ManyToOne(fetch = FetchType.EAGER)
  8. @JoinColumn(name="codEstado",insertable=true,updatable=true)
  9. @Fetch(FetchMode.JOIN)
  10. @Cascade(CascadeType.SAVE_UPDATE)
  11. private Estado estado;
  12.  
  13. private String nome;
  14.  
  15. private String sigla;
  16.  
  17. public String getSigla() {
  18. return sigla;
  19. }
  20.  
  21. public void setSigla(String sigla) {
  22. this.sigla = sigla;
  23. }
  24.  
  25. public long getIdCidade() {
  26. return idCidade;
  27. }
  28.  
  29. public void setIdCidade(long idCidade) {
  30. this.idCidade = idCidade;
  31. }
  32.  
  33. public Estado getEstado() {
  34. return estado;
  35. }
  36.  
  37. public void setEstado(Estado estado) {
  38. this.estado = estado;
  39. }
  40.  
  41. public String getNome() {
  42. return nome;
  43. }
  44.  
  45. public void setNome(String nome) {
  46. this.nome = nome;
  47. }
  48.  
  49. }

Vale comentar algumas anotações que usei aqui:

@ManyToOne(fetch = FetchType.EAGER) -> como o relacionamento é de “N para 1”, uma Cidade pertence a um Estado e o Estado pode ter várias Cidade, usamos a anotação @ManyToOne e também usamos o FethType:

EAGER -> Sempre que o Objeto pai for trazido o atributo mapeado também será trazido) cuidado ao usar pois se for relacionamentos mais complexo, ou melhor, que contém muitos objetos dentro do outro pode ficar muito lento, no nosso exemplo não temos que ser preocupar com isso.

LAZY -> Sempre que o objeto pai for trazido o atributo mapeado só será trazido quando acessado pela primeira vez(muito usado quando é List, Collection para evitar o que citei logo acima).

@JoinColumn(name="codEstado",insertable=true,updatable=true) -> informamos qual é o campo é a chave estrangeira, no caso da Cidade a chave estrangeira é o codEstado. O insertable e o updatable quando indicados como true significa que esse objeto tem que ser inserido ou atualizado quando o objeto pai é inserido ou atualizado, resumindo, Toda vez que for inserir e atualizar um Cidade também será inserido ou atualizado um Estado.

@Fetch(FetchMode.JOIN) -> informamos que estamos juntando as duas tabelas, melhor dizendo, como se estivesse usando o Inner Join na injeção de SQL.

@Cascade(CascadeType.SAVE_UPDATE)-> por ultimo a permissão que esse atributo pode interferir na Classe ao qual está fazendo o relaciomento. Explico, ao colocar SAVE_UPDATE se caso você esteja inserindo uma cidade e o estado ainda não foi inserido, ele automaticamente vai adicionar esse Estado, pegar o id do mesmo e gravar na tabela cidade no campo codEstado, Hibernate é Kara ;) .

Depois de explicado as anotações as outras classes que ficam no Java já foram explicadas e só serão adicionadas logo abaixo:

CidadeRepository.java

JAVA:
  1. public interface CidadeRepository {
  2.  
  3.     public void save(Cidade cidade);
  4.     public void remove(Cidade cidade);
  5.  
  6.     public List<cidade> findAll();
  7.     public List<cidade> findByName(String nome);
  8.  
  9. }

CidadeService.java

JAVA:
  1. @Service(value="CidadeService")
  2. public class CidadeService {
  3.  
  4.     CidadeRepository cidadeRepository;
  5.  
  6.     @Autowired
  7.     public void setCidadeRepository(CidadeRepository cidadeRepository) {
  8.         this.cidadeRepository = cidadeRepository;
  9.     }
  10.  
  11.     public void save(Cidade cidade){
  12.         cidadeRepository.save(cidade);
  13.     }
  14.  
  15.     public void remove(Cidade cidade){
  16.         cidadeRepository.remove(cidade);
  17.     }
  18.  
  19.     public List<cidade> findAll(){
  20.         return cidadeRepository.findAll();
  21.     }
  22.  
  23.     public List<cidade> findByName(String nome){
  24.         return cidadeRepository.findByName(nome);
  25.     }
  26.  
  27. }

CidadeDao.java

JAVA:
  1. @Repository(value="CidadeRepository")
  2. public class CidadeDao extends HibernateDaoSupport
  3.     implements CidadeRepository {
  4.  
  5.     @Autowired
  6.     public CidadeDao(@Qualifier("sessionFactory") SessionFactory sessionFactory) {
  7.         // TODO Auto-generated constructor stub
  8.         super.setSessionFactory(sessionFactory);
  9.     }
  10.  
  11.     @Override
  12.     public void remove(Cidade cidade) {
  13.         // TODO Auto-generated method stub
  14.         getHibernateTemplate().delete(cidade);
  15.     }
  16.  
  17.     @SuppressWarnings("unchecked")
  18.     @Override
  19.     public List<cidade> findAll() {
  20.         // TODO Auto-generated method stub
  21.         return getHibernateTemplate().loadAll(Cidade.class);
  22.     }
  23.  
  24.     @SuppressWarnings("unchecked")
  25.     @Override
  26.     public List<cidade> findByName(String nome) {
  27.         // TODO Auto-generated method stub
  28.         return getHibernateTemplate().find("from Cidade" +
  29.                 " where nome like '%" + nome + "%'");
  30.     }
  31.  
  32.     @Override
  33.     public void save(Cidade cidade) {
  34.         // TODO Auto-generated method stub
  35.         getHibernateTemplate().saveOrUpdate(cidade);
  36.     }
  37.  
  38.  
  39. }

Agora é só adicionar o serviço no blazeds e ir para a parte flex.

remoting-config.xml

XML:
  1. <destination id="CidadeService">
  2.         <properties>
  3.             <factory>spring</factory>
  4.             <source>CidadeService</source>
  5.         </properties>
  6.     </destination>

OBS. Aqui já começa uma pequena discussão, se você perceber os Repository, Service e Dao de Cidade e Estado são praticamente idênticos, e muitos vão optar por trabalhar com classes Genéricas, tipo RepositoryGeneric, DaoGeneric. Nada contra, só que eu prefiro deixar separado, se você usar genérico tome muito cuidado, uma vez tomei o genérico de novalgina e fiquei uma semana mal, acabou o genérico comprei novalgina e a dor de cabeça passou em 30 minutos, hehe.

Outra coisa aí sim eu recomendo é o seguinte, de vez de ter um Service para a cidade e outra para estado criar um tipo addresService, cuja esse serviço manipularia o estado, a cidade o bairro... enfim, tudo que tem haver com endereço, isso é normal, o service na verdade é isso, mais como nos exemplos fica tudo separado as pessoas colocam separado, então, mesmo não fazendo assim neste exemplo recomendo a todos depois fazer isso neste exemplo, considere dever de casa :) .

Implementação no Flex

No flex a implementação é mais simples ainda, a base de ctrl+c ctrl+v, vamos ao código:

Cidade.as

ACTIONSCRIPT:
  1. [RemoteClass(alias="com.saberprogramar.business.entitys.Cidade")]
  2.     [Bindable]
  3.     public class Cidade
  4.     {
  5.  
  6.         public var idCidade:Number;
  7.  
  8.         public var estado:Estado;
  9.  
  10.         public var nome:String;
  11.  
  12.         public var sigla:String;
  13.  
  14.  
  15.  
  16.     }

A única coisa que Vale lembrar aqui é que como no Java você usa o relacionamento com a classe Estado, no Action script tem que acontecer a mesma coisa, se não você não relaciona objetos, tipo, ao invés de colocar “estado:Estado” colocar “idEstado:Number” vc não está programando orientado a objeto, você na verdade está criando classes que sejam clone das suas tabelas do banco de dados, fazendo isso você está perdendo o melhor que o mundo OO pode te oferecer. É aqui que vejo uma constante dúvida que tenho recebido por contato aqui no Blog, então aí vai:

  • Não! de maneira nenhuma deixe de fazer os relacionamentos dos seus objetos, uma cidade faz parte de um Estado e não de um código do estado, então... tanto no Java, como no Action Script, quanto no php e outra qualquer linguagem não considere seus objetos uma cópia de suas tabelas do banco de dados.
  • Se no Java você tem um atributo “Estado estado” no actionScript você vai ter um ”estado:Estado”. Quando usamos RemoteObject o action script tem que ser igual ao Java ou ao php, é um clone, não pode ter um “Estado estado” no Java e um “idEstado:Number” no Action Script, não vai funcionar e você vai ter aquela sensação, é alguma bobeira que eu não estou vendo.


CidadeDelegate.as

ACTIONSCRIPT:
  1. public class CidadeDelegate extends AbstractDelegate
  2.     {
  3.  
  4.         [Autowire(bean="cidadeService")]
  5.         public var cidadeService:RemoteObject;
  6.  
  7.         public function CidadeDelegate()
  8.         {
  9.             super();
  10.         }
  11.  
  12.  
  13.         //AS OPERAÇÕES CRUD
  14.         public function findAll():AsyncToken{
  15.             return cidadeService.findAll();
  16.         }
  17.  
  18.         public function findByName(nome:String):AsyncToken{
  19.             return cidadeService.findByName(nome);
  20.         }
  21.  
  22.         public function save(cidade:Cidade):AsyncToken{
  23.             return cidadeService.save(cidade);
  24.         }
  25.  
  26.         public function remove(cidade:Cidade):AsyncToken{
  27.             return cidadeService.remove(cidade);
  28.         }
  29.  
  30.  
  31.     }

CidadeEvent.as

ACTIONSCRIPT:
  1. public class CidadeEvent extends Event
  2.     {
  3.  
  4.         public static const SAVE:String = "saveCidade";
  5.         public static const REMOVE:String = "removeCidade";
  6.  
  7.  
  8.         public function CidadeEvent(type:String)
  9.         {
  10.             super(type);
  11.         }
  12.  
  13.  
  14.     }

ICidadeController.as

ACTIONSCRIPT:
  1. public interface ICidadeController
  2.     {
  3.  
  4.         function get cidadeList():ArrayCollection;
  5.  
  6.         function findAll():void;
  7.  
  8.         function findByName(nome:String):void;
  9.  
  10.         function save(cidade:Cidade):void;
  11.  
  12.         function remove(cidade:Cidade):void;
  13.  
  14.     }

CidadeController.as

ACTIONSCRIPT:
  1. public class CidadeController extends AbstractController
  2.         implements ICidadeController{
  3.  
  4.         [Bindable]
  5.         public var cidadeList:ArrayCollection;
  6.  
  7.         [Autowire(bean="cidadeDelegate")]
  8.         public var cidadeDelegate:CidadeDelegate;
  9.  
  10.         public function CidadeController()
  11.         {
  12.             super();
  13.         }
  14.  
  15.         public function findAll():void{
  16.             executeServiceCall(cidadeDelegate.findAll(),onFindAll,onError);
  17.         }
  18.  
  19.         public function findByName(nome:String):void{
  20.             executeServiceCall(cidadeDelegate.findByName(nome),onFindByName,onError);
  21.         }
  22.  
  23.         public function save(cidade:Cidade):void{
  24.             executeServiceCall(cidadeDelegate.save(cidade),onSave,onError);
  25.         }
  26.  
  27.         public function remove(cidade:Cidade):void{
  28.             executeServiceCall(cidadeDelegate.remove(cidade),onRemove,onError);
  29.         }
  30.  
  31.         //*************** Handle Results ************************//
  32.  
  33.         public function onFindAll(event:ResultEvent):void{
  34.             cidadeList = ArrayCollection(event.result);
  35.         }
  36.  
  37.         public function onFindByName(event:ResultEvent):void{
  38.             cidadeList = event.result as ArrayCollection;
  39.         }
  40.  
  41.         public function onSave(event:ResultEvent):void{
  42.             Swiz.dispatchEvent(new CidadeEvent(CidadeEvent.SAVE));
  43.         }
  44.  
  45.         public function onRemove(event:ResultEvent):void{
  46.             Swiz.dispatchEvent(new CidadeEvent(CidadeEvent.REMOVE));
  47.         }
  48.  
  49.         private function onError(event:FaultEvent):void{
  50.             Alert.show(event.fault.message,"ERROR");
  51.         }
  52.  
  53.  
  54.  
  55.  
  56.     }

Adicionados estas classes é só adicionar o mapeamento dos mesmos e o RemoteObjetct no nosso Beans.mxml.

XML:
  1. <!-- cidade service -->
  2.     <mx:RemoteObject id="cidadeService"
  3.                      destination="CidadeService"
  4.                      channelSet="{myAmfChannel}"/>
  5.  
  6.     <!-- delegate for the cidade controller -->
  7.     <delegates:CidadeDelegate id="cidadeDelegate"/>
  8.  
  9.     <!-- cidade controller -->
  10.     <controllers:CidadeController id="cidadeController"/>

Agora vamos a interface(view) com algumas explicações:

CidadeView.mxml

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="518" height="422"
  4.      title="Cadastro de Cidades" fontSize="10" xmlns="flexmdi.containers.*"
  5.      xmlns:controls="com.flexpernambuco.controls.*"
  6.      creationComplete="{init()}" showCloseButton="true" close="{exit()}">
  7.  
  8.     <mx:ViewStack x="10" y="10" id="stack" width="486" height="362">
  9.  
  10.         <mx:Canvas label="View 1" width="100%" height="100%" id="canvasDefault">
  11.             <mx:Button x="138" y="330" label="Incluir" id="btnIncluir" click="{save()}"/>
  12.             <mx:Button x="209" y="330" label="Alterar" id="btnAlterar" click="{update()}"/>
  13.             <mx:Button x="284" y="330" label="Excluir" id="btnExcluir" click="{remove()}"/>
  14.             <mx :D ataGrid x="10" y="40" width="466" height="282" dataProvider="{controller.cidadeList}" id="dgCidade">
  15.                 <mx:columns>
  16.                     <mx :D ataGridColumn headerText="ID" dataField="idCidade" width="70"/>
  17.                     <mx :D ataGridColumn headerText="Nome da Cidade" dataField="nome"/>
  18.                     <mx :D ataGridColumn headerText="Sigla" dataField="sigla" width="70"/>
  19.                     <mx :D ataGridColumn headerText="UF" labelFunction="colEstado" width="70"/>
  20.                 </mx:columns>
  21.             </mx :D ataGrid>
  22.             <mx:TextInput x="273" y="10" id="txtFind"/>
  23.             <mx:Button x="441" y="10" width="35" icon="@Embed(source='com/saberprogramar/assets/images/find-16x16.png')" id="btnFind" click="{find()}"/>
  24.         </mx:Canvas>
  25.  
  26.         <mx:Canvas label="" width="100%" height="100%" id="canvasForm">
  27.             <mx:Form x="10" y="67" width="466" height="146">
  28.                 <mx:FormItem label="ID:">
  29.                     <mx:TextInput width="72" id="txtIdCidade" editable="false" tabIndex="0"
  30.                         toolTip="Código Gerado Automático" text="{cidade.idCidade.toString()}"/>
  31.                 </mx:FormItem>
  32.                 <mx:FormItem label="Estado" required="true">
  33.                     <mx:ComboBox id="cmbEstado" dataProvider="{controllerEstado.estadoList}"
  34.                         labelField="nome" prompt="Selecione um Estado" tabIndex="1">
  35.                     </mx:ComboBox>
  36.                 </mx:FormItem>
  37.                 <mx:FormItem label="Nome:" required="true">
  38.                     <mx:TextInput width="339" id="txtNome" text="{cidade.nome}" tabIndex="2"/>
  39.                 </mx:FormItem>
  40.                 <mx:FormItem label="Sigla:" required="true">
  41.                     <mx:TextInput width="43" id="txtSigla" maxChars="2" text="{cidade.sigla}"   tabIndex="3" />
  42.                 </mx:FormItem>
  43.             </mx:Form>
  44.             <mx:FormHeading x="157.5" y="21" label="Formulário de Estado" width="171"/>
  45.             <mx:Button x="160" y="221" label="Cancelar" id="btnCancelar" click="{cancel()}" tabIndex="6"/>
  46.             <mx:Button x="243" y="221" label="Confirmar" id="btnConfirmar" click="{confirm()}" tabIndex="5"/>
  47.         </mx:Canvas>
  48.     </mx:ViewStack>
  49.  
  50.     <mx:Script source="actions/CidadeAction.as"/>
  51.  
  52. </mx:TitleWindow>

Agora vamos mostrar sua action:

CidadeAction.as

ACTIONSCRIPT:
  1. // ActionScript file
  2. import com.saberprogramar.controllers.ICidadeController;
  3. import com.saberprogramar.controllers.IEstadoController;
  4. import com.saberprogramar.events.CidadeEvent;
  5. import com.saberprogramar.models.entitys.Cidade;
  6. import com.saberprogramar.models.entitys.Estado;
  7.  
  8. import mx.controls.dataGridClasses.DataGridColumn;
  9. import mx.managers.PopUpManager;
  10.  
  11. import org.swizframework.Swiz;
  12.  
  13. [Bindable]
  14. private var cidade:Cidade;
  15.  
  16. [Bindable]
  17. [Autowire(bean="estadoController")]
  18. public var controllerEstado:IEstadoController;
  19.  
  20. [Bindable]
  21. [Autowire(bean="cidadeController")]
  22. public var controller:ICidadeController;
  23.  
  24. private function init():void{
  25.  
  26.     PopUpManager.centerPopUp(this);
  27.  
  28.     Swiz.addEventListener(CidadeEvent.SAVE,onSaveComplete);
  29.     Swiz.addEventListener(CidadeEvent.REMOVE,onRemoveComplete);
  30.  
  31.     findAll();
  32. }
  33.  
  34. private function findAll():void{
  35.     controller.findAll();
  36.     controllerEstado.findAll();
  37. }
  38.  
  39. private function save():void{
  40.     cidade = new Cidade();
  41.     stack.selectedChild = canvasForm;
  42. }
  43.  
  44. private function update():void{
  45.  
  46.     if (dgCidade.selectedItem != null){
  47.  
  48.         dgCidade.setStyle("bordercolor",'black');
  49.         dgCidade.errorString = "";
  50.  
  51.         cidade = dgCidade.selectedItem as Cidade;
  52.         stack.selectedChild = canvasForm;
  53.  
  54.     }else {
  55.         dgCidade.setStyle("bordercolor",'red');
  56.         dgCidade.errorString = "Selecione uma Cidade para alterar";
  57.     }
  58.  
  59. }
  60.  
  61. private function remove():void{
  62.  
  63.     if (dgCidade.selectedItem != null){
  64.  
  65.         dgCidade.setStyle("bordercolor",'black');
  66.         dgCidade.errorString = "";
  67.  
  68.         cidade = dgCidade.selectedItem as Cidade;
  69.  
  70.         controller.remove(cidade);
  71.  
  72.  
  73.     }else {
  74.         dgCidade.setStyle("bordercolor",'red');
  75.         dgCidade.errorString = "Selecione uma Cidade para excluir";
  76.     }
  77.  
  78. }
  79.  
  80. private function confirm():void{
  81.  
  82.     cidade.idCidade = new Number(txtIdCidade.text);
  83.     cidade.estado = cmbEstado.selectedItem as Estado;
  84.     cidade.nome = txtNome.text;
  85.     cidade.sigla = txtSigla.text;
  86.  
  87.     controller.save(cidade);
  88.  
  89. }
  90.  
  91. private function cancel():void{
  92.     cidade = new Cidade();
  93.     stack.selectedChild = canvasDefault;
  94. }
  95.  
  96. private function find():void{
  97.  
  98.     if (txtFind.text != null){
  99.         controller.findByName(txtFind.text);
  100.     }
  101.  
  102. }
  103.  
  104. private function onSaveComplete(event:CidadeEvent):void{
  105.     stack.selectedChild = canvasDefault;
  106.     findAll();
  107. }
  108.  
  109. private function onRemoveComplete(event:CidadeEvent):void{
  110.     stack.selectedChild = canvasDefault;
  111.     findAll();
  112. }
  113.  
  114. private function colEstado(objCidade:Cidade, col:DataGridColumn):String{
  115.     return objCidade.estado.uf;
  116. }
  117.  
  118. private function exit():void{
  119.     PopUpManager.removePopUp(this);
  120. }

Como Pode perceber existe algumas novidades comparado ao código do estado, uma é a combo que carrega todos os estados:

XML:
  1. <mx:ComboBox id="cmbEstado" dataProvider="{controllerEstado.estadoList}"
  2.                         labelField="nome" prompt="Selecione um Estado" tabIndex="1">
  3.                     </mx:ComboBox>

  1. O DataProvider da combo é o estadoList da nossa controllerEstado.
  2. o label Field é o “nome”(atributo da classe estado).
  3. prompt é o texto inicial da combo.

A parte mais interessante neste caso é o grid, usamos a função labelFunction:

XML:
  1. <mx :D ataGridColumn headerText="UF" labelFunction="colEstado" width="70"/>

Neste caso indicamos que o label desta coluna vem do retorno de uma função chamada colEstado:

ACTIONSCRIPT:
  1. private function colEstado(objCidade:Cidade, col:DataGridColumn):String{
  2.     return objCidade.estado.uf;
  3. }

Se você perceber temos uma função que espera como retorno uma String, e aqui podemos ver já uma vantagem de usar os relacionamentos de objetos de maneira correta, uma cidade contém um estado, então ao fazer o que fizemos acima conseguimos pegar qualquer atributo da nossa classe Estado e mostrar no grid sem a necessidade de fazer um FindById ou algo parecido.

Bem, é isso, atualizei o código fonte, caso queiram podem baixar nos links logo abaixo, qualquer dúvida pode entrar em contato, ou se preferir postar um comentário.

Até a Próx.

Caso queira o projeto em java é só baixar aqui (sem as libs).

Caso queira o projeto em flex é só baixar aqui.


Popularity: 48% [?]

Tags: , , , , , , , , , , ,

Categoria(s):#JAVA + FLEX NA PRÁTICA, Adobe Flex, Blazeds, Hibernate, Java, MVC, Spring, Swiz Framework


Outros Artigos:

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

17 Responses to “TUTORIAL JAVA + FLEX NA PRÁTICA 7/6 – Bônus”

  1. Mauricio disse:

    Janderson
    Como muitos que leram seu tutorial fizeram, tbm resolvir mudar minha linha de trabalho(estudo) que vinha fazendo na integracao do Java e Flex, alterei meu projeto seguindo os passos do seu.
    Porem mesmo usando as mesmas LIBs que vc publicou, o eclipse me acusa erro em 2 locais.

    @Override
    public void setBeanClassLoader(ClassLoader beanClassLoader)
    {
    this.beanClassLoader = beanClassLoader;
    }

    com a msg:
    The method setBeanClassLoader(ClassLoader) of type AnnotationOptimizedSessionFactoryBean must override or implement a supertype method AnnotationOptimizedSessionFactoryBean.java

    E na linha:
    @Repository(value = "EstadoRepository")

    com a msg:
    The attribute value is undefined for the annotation type Repository EstadoDao.java

    Se puder me ajudar, fico grato.
    e parabens pelo otimo blog

  2. janderson disse:

    Olá Mauricio, fico feliz em poder ajudar muitos em seus estudos, não sei muito mas o que sei tento passar para outras pessoas e ajudar para que não tenham tanta dificuldade como eu tive para aprender ;)

    sobre o @Repository verifique se existe o import
    import org.springframework.stereotype.Repository; , fora isso não imagino o que possa ser.

    sobre o setBeanClassLoader já tive problemas com essa classe só não lembro se foi neste método, essa classe depende do tomcat configurado no eclipse, pesquisa na internet como configurar o tomcat dentro do eclipse... quando o projeto estiver dentro do conteiner creio que vai funcionar... ve se ajuda e me fala... se não der certo faço um teste do zero para ver se te ajudo ;)

    Cumps.

  3. Mauricio disse:

    Janderson,
    a import org.springframework.stereotype.Repository; esta sendo declarada no arquivo e mesmo assim acusa o erro que o attributo "value" e desconhecido.

    e no setBeanClassLoader todas os imports estao como no seu tutorial, e o tomcat esta configurado e funcionando, pois antes de alterar meu sistema conforme seu tutorial a comunicacao do Flex com Java nela esta normal.

    vou dar uma procurada no google para ver se acho algo sobre isso, caso ache alguma coisa favor me avisar.
    Grato pela atencao.

  4. Mauricio disse:

    Janderson, se vc tiver um tempo favor me enviar um email mpsfox@gmail.com

  5. Zanata disse:

    Janderson quero parabenizar pelo excelente material que nos diponibilizou principalmente
    para quem esta iniciando com Flex, segui passo a passo seu tutorial só que estou com a
    seguinte duvida qndo abro a CidadeView pela primeira vez e disparo a function Save ela
    executa o onSaveComplete uma vez, se fecho a CidadeView e abro pela segunda vez e disparo
    a function Save o onSaveComplete será executada 2 vezes se fecho e abro a CidadeView
    pela terceira vez e disparo a function Save o onSaveComplete será executado 3 vezes
    oque pode estar acontecendo ?

  6. Zanata disse:

    Ja identifiquei oque estava acontecendo....
    Grato...

  7. janderson disse:

    demorei tanto a responder que vc já resolveu...rs

    mas diga por favor, era algum bug da aplicação exemplo aqui do blog, se for nos avise para acertar, ficarei grato ;)

    Cumps.

  8. oliver disse:

    Ótimo tutorial, parabéns, esse foi para os meus favoritos !

  9. Marco Antônio disse:

    Meu amigo, tava tomando Nullpointer com SpringHibernateAnnotations, e já tava me matando de impaciência, hehehe, comecei a mexer tem mais ou menos 3 dias "a fundo" depois de ler alguns livros e tutorias da Net como o do Rodrigo, felizmente parei aqui, sinceramente ainda não testei, espero que funcione legal hehehe, porém apenas pelo fato de compartilhar isto, já te parabenizo, tinha achado a classe que comentou no primeiro post justamente no fórum flex. Funcionando pode deixar que farei o que puder pra divulgar esta tecnologia também. Um grande Abs! Marco Antônio

  10. janderson disse:

    é isso aí @Marco, vamos divulgar, flex para todos e todos pelo flex.hehe. Obrigado pelas palavras é sempre incentivador ;)

    Cumps.

  11. Marco Antônio disse:

    Então Janderson apenas para comentar!!!
    Testei aqui, mudei algumas coias, implementei o que você postou com algumas coisas que o Rodrigo postou e funcionou as mil maravilhas, agora é prosseguir no projeto, e daqui a pouco com certeza estarei colocando no ar também um tuto um pouco mais básico, agradeço mais uma vez, pelo tuto maravilhoso, e nos encontramos por ae!!! Abs!!!

  12. JOSÉ MARCELLO ALEMAR disse:

    Boa tarde,

    Não estou consiguindo rederizar imagens, seja no datagrid ou num componente image em um canvas por exemplo a partir de um controller ...
    Obs: Todo a parte de CRUD já funciona corretamente

    Tem alguma dica sobre isto ?

    Obrigado.

    • jandersonfc disse:

      boa tarde José..então... renderizar imagens ficou meio vago... como esss imagem vai da controller para a view... é uma string com o caminho... é um byteArray?

      • JOSÉ MARCELLO ALEMAR disse:

        Obrigado pela atenção Janderson,

        Tenho uma propriedade, pathEscudo, que é uma string, naqual gravo o camniho de uma dada imagem - o que é gravado no banco de dados é este caminho; Esta propriedade é referente a uma classe Time, cujo tratamento está todo feito o modelo que você expôs, isto é, vem de um controller, ligado a um service remoto do java.

        ; Agora veja o código abaixo no meu datagrid dentro do mxml:

        <mx:itemRenderer><mx:Component ><mx:Image source="{pathEscudo}"/></mx:Component>
        </mx:itemRenderer>

        Só que o flex não tá conseguindo pegar o conteúdo de {pathEscudo} e mostrar a imagem correspondente; Se coloco o caminho no código para testar:

        Ex:
        Image source="br/org/cesgranrio/bolao/assets/images/Clubes Minuaturas/Flamengo.gif"
        ele busca a imagem.

  13. [...] TUTORIAL JAVA + FLEX NA PRÁTICA 7/6 – Bônus [...]

  14. [...] TUTORIAL JAVA + FLEX NA PRÁTICA 7/6 – Bônus [...]

Leave a Reply