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 icon razz TUTORIAL JAVA + FLEX NA PRÁTICA 7/6   Bônus . 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 icon wink TUTORIAL JAVA + FLEX NA PRÁTICA 7/6   Bônus .

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 ListfindAll();
  7. public List 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 ListfindAll(){
  20. return cidadeRepository.findAll();
  21. }
  22.  
  23. public ListfindByName(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 findAll() {
  20. // TODO Auto-generated method stub
  21. return getHibernateTemplate().loadAll(Cidade.class);
  22. }
  23.  
  24. @SuppressWarnings("unchecked")
  25. @Override
  26. public List 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. }

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

remoting-config.xml

XML:
  1.  
  2.  
  3. spring
  4. <source />CidadeService

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 icon smile TUTORIAL JAVA + FLEX NA PRÁTICA 7/6   Bônus .

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. }

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. //AS OPERAÇÕES CRUD
  13. public function findAll():AsyncToken{
  14. return cidadeService.findAll();
  15. }
  16.  
  17. public function findByName(nome:String):AsyncToken{
  18. return cidadeService.findByName(nome);
  19. }
  20.  
  21. public function save(cidade:Cidade):AsyncToken{
  22. return cidadeService.save(cidade);
  23. }
  24.  
  25. public function remove(cidade:Cidade):AsyncToken{
  26. return cidadeService.remove(cidade);
  27. }
  28.  
  29. }

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. public function CidadeEvent(type:String)
  8. {
  9. super(type);
  10. }
  11.  
  12. }

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. }

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

XML:
  1. <!-- cidade service -->
  2. destination="CidadeService"
  3. channelSet="{myAmfChannel}"/&gt;
  4.  
  5. &nbsp;
  6.  
  7. &nbsp;

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

CidadeView.mxml

XML:
  1. <!--?xml version="1.0" encoding="utf-8"?-->
  2.  
  3. title="Cadastro de Cidades" fontSize="10" xmlns="flexmdi.containers.*"
  4. xmlns:controls="com.flexpernambuco.controls.*"
  5. creationComplete="{init()}" showCloseButton="true" close="{exit()}"&gt;
  6.  
  7. &nbsp;
  8.  
  9. toolTip="Código Gerado Automático" text="{cidade.idCidade.toString()}"/&gt;
  10.  
  11. labelField="nome" prompt="Selecione um Estado" tabIndex="1"&gt;
  12.  
  13. &nbsp;
  14.  
  15. &nbsp;

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. }else {
  73. dgCidade.setStyle("bordercolor",'red');
  74. dgCidade.errorString = "Selecione uma Cidade para excluir";
  75. }
  76.  
  77. }
  78.  
  79. private function confirm():void{
  80.  
  81. cidade.idCidade = new Number(txtIdCidade.text);
  82. cidade.estado = cmbEstado.selectedItem as Estado;
  83. cidade.nome = txtNome.text;
  84. cidade.sigla = txtSigla.text;
  85.  
  86. controller.save(cidade);
  87.  
  88. }
  89.  
  90. private function cancel():void{
  91. cidade = new Cidade();
  92. stack.selectedChild = canvasDefault;
  93. }
  94.  
  95. private function find():void{
  96.  
  97. if (txtFind.text != null){
  98. controller.findByName(txtFind.text);
  99. }
  100.  
  101. }
  102.  
  103. private function onSaveComplete(event:CidadeEvent):void{
  104. stack.selectedChild = canvasDefault;
  105. findAll();
  106. }
  107.  
  108. private function onRemoveComplete(event:CidadeEvent):void{
  109. stack.selectedChild = canvasDefault;
  110. findAll();
  111. }
  112.  
  113. private function colEstado(objCidade:Cidade, col:DataGridColumn):String{
  114. return objCidade.estado.uf;
  115. }
  116.  
  117. private function exit():void{
  118. PopUpManager.removePopUp(this);
  119. }

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

XML:
  1. labelField="nome" prompt="Selecione um Estado" tabIndex="1"&gt;

  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:

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.


{lang: 'pt-BR'}

You can leave a response, or trackback from your own site.
  • Mauricio

    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

  • http://saberprogramar.com/blog/ janderson

    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.

  • Mauricio

    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.

  • Mauricio

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

  • Zanata

    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 ?

  • Zanata

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

  • http://saberprogramar.com/blog/ janderson

    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.

  • oliver

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

  • Marco Antônio

    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

  • http://saberprogramar.com/blog/ janderson

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

    Cumps.

  • Marco Antônio

    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!!!

  • JOSÉ MARCELLO ALEMAR

    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.

    • http://intensedebate.com/people/jandersonfc jandersonfc

      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

        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.

  • Pingback: TUTORIAL JAVA + FLEX NA PRÁTICA (8) - Datas | jandersonfc

  • Pingback: TUTORIAL JAVA + FLEX NA PRÁTICA (9) – Atualizando o Swiz | jandersonfc

  • Pingback: TUTORIAL JAVA + FLEX NA PRÁTICA (9) – Atualizando o Swiz - redeRIA | Agregador de noticias, artigos, tutoriais Flex, Flash, JavaFX, AJAX e Rich internet applications em geral!

  • Pingback: TUTORIAL JAVA + FLEX + IREPORT NA PRÁTICA (11) - redeRIA | Agregador de noticias, artigos, tutoriais Flex, Flash, JavaFX, AJAX e Rich internet applications em geral!

  • http://WINDOWSMOBILEDEVICECENTER.INFO Marlon Oesch

    We really love this blog. Iwish we could come here all the time.

  • Julio

    Parabéns pelos seus posts.
    Estou iniciando no flex, mas trabalho há muito tempo com java, fiquei com uma dúvida: vc fez o backend no eclipse e o frontend no flex builder, como você integra o back + o front? Como é integrado num projeto só feito em duas IDEs?

    • http://www.jandersonfc.com jandersonfc

      vlw Julio ;)

      então na verdade o flex builder é baseado no eclipse e se vc quiser pode de vez de intalar ele full instalar como plugin no seu eclipse ficando assim apenas como um IDE e 2 projetos(esse foi o jeito que fiz no tutorial, tem muita gente que prefere ter o java e o flex no mesmo projeto como é o exemplo do Rodrigo fraga que citei como base na 1 parte deste tutorial).

      Mesmo assim muito bem lembrado por vc são dois projetos diferentes e como fazer para integrá-los? a resposta são várias... enquanto desenvolvimento vc pode apontar para os swf que o flex gera para cair no seu webContent indo em properties - &gt; build Path -&gt; Output Folder.

      assim toda alteração que vc fizer no flex já vai estar atualizado no webcontent, isso é bom como falei como desenvolvimento e tal... agora na hora de gerar o deploy mesmo para entregar o .war com sua aplicação pronto pode usar o ant como o erko indica aqui http://blog.erkobridee.com/2010/01/20/adobe-flex-...

      além disso é muito usado o maven + o plugin flexmojos, eu mesmo curto ele demais , deixa a integração do flex com o java super tranquilo.

      Cumps.

  • Reginaldo

    Boa noite pessoal, estou tendo um problema na integração, quando coloco a chamada para cidade dentro do Beans.mxml, aparece o seguinte problema no eclipse: An internal build error has occurred. Right-click for more e não tem mais nada pra ajudar a partir dai a aplicação para de funcionar e a pagina não sobe mais, dando erro 404, já verifiquei todas as classes de cidade, conferi uma a uma com o tutorial e tenho certeza que todas estão corretas, verifiquei também os xml's e nada se alguém puder ajudar fico grato.

    vlw

  • Tatiane

    OLá!

    estou apanhando pra configurar as libs do projeto crud spring flex.

    Pode, por gentileza, me enviar o projeto completo com as libs?

    Agradeço antecipadamente!!!

  • rfogo

    jandersonfc,

    Preciso de pegar os dados de um Objeto em um AdvancedDataGrid e tentei utilizar o labelfunction que você demostrou porém da o seguinte ao compilar:

    "TypeError: Error #1034: Falha de coerção de tipo: não é possível converter Object@73475e1 em xxx.xxxxx.xxxxx.xxx.xxxxxx."

Subscribe to RSS Feed Follow me on Twitter!