Integrando Adobe Flex + BlazeDS + SpringFramework + Hibernate – Uma Solução OpenSource para Sistemas Web. (Parte 2 – Final)

Olá Pessoal!

Primeiro lugar, quero agradecer a todos pelo feedback do post anterior, isto é motivante e me dá ânimo em concluir este, e outros que virão.

Hoje o foco deste artigo é que você termine ele sabendo:

Configurar os Beans do Spring através de annotations;

Integrar o esquema de Beans do Spring com os services do Flex através de uma Factory;

Configurar o Spring para usar o Hibernate para abstrair nosso banco de dados;

Para isso vamos a uma breve introdução a estes poderosos frameworks

Breve Introdução ao Spring

spring

Como não sou fã de ficar re-escrevendo a roda, vou tentar dar a você leigo em Spring, um caminho para estudar.

Primeiro de tudo, leia este artigo feito pelo Phillip Calçado (Shoes)
apostila-spring.pdf 
Valeu
Ebertom pela hospedagem! =)

Uma Introdução ao que o  SpringFramework pode oferecer:
http://blog.fragmental.com.br/2005/08/31/spring-em-acao/
http://www.ime.usp.br/~reverbel/SMA/Slides/seminarios/spring.pdf
http://imasters.uol.com.br/artigo/4497/java/spring_framework_introducao/

Outros Tutoriais
http://www.javafree.org/content/view.jf?idContent=46

http://www.devmedia.com.br/articles/viewcomp.asp?comp=6627
http://www.devmedia.com.br/articles/viewcomp.asp?comp=6628
http://www.devmedia.com.br/articles/viewcomp.asp?comp=6653

Spring Annotations
http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/
http://weblogs.java.net/blog/seemarich/archive/2007/11/annotation_base_1.html

Exemplos de códigos
http://paulojeronimo.com/arquivos/tutoriais/tutorial-spring-framework.zip
http://www.java2s.com/Code/Java/Spring/CatalogSpring.htm

Documentação
The Spring Framework – Reference Documentation

Bom acredito que se você que está afim de conhecer o SpringFramewok, com esses Link’s já é possível entender quase tudo o que ele pode oferecer a sua arquitetura. Lembrando que não é recomendável seguir com este artigo, sem antes entender como funciona  IoC, AOP, DAO, com o SpringFramework.

*Nota A abordagem aqui é sobre o SpringFramework, (Framework de Negócio) e não sobre o SpringMVC, uma vez que o Flex pode se trocar objetos através do protocolo AMF3, é totalmente dispensável o uso de Frameworks MVC’s.

Breve Introdução ao Hibernate

Como eu já disse, uma vez que já existe um bom conteúdo sobre Hibernate na Internet, não há a necessidade de re-escrever, por isso vou lhe dar a você leigo em Hibernate uma sequência de Link que irá te ajudar a entender este poderoso Framework.

Uma Introdução ao que o  Hibernate pode oferecer:
http://www.students.ic.unicamp.br/~ra007271/docs/white-papers/hibernate-uma_introducao_dirigida.pdf
http://www.guj.com.br/java.tutorial.artigo.125.1.guj
http://www.jeebrasil.com.br/mostrar/4
http://www.devmedia.com.br/articles/viewcomp.asp?comp=4149

Outros Tutoriais
http://simundi.blogspot.com/2007/09/criar-uma-aplicao-com-hibernate.html
http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html
http://www.hibernate.org/hib_docs/tools/reference/en/html/plugins.html
http://www.guj.com.br/posts/list/7249.java

Pacotão de PDF’s
http://br.groups.yahoo.com/group/java-br/files/Hibernate/

Exemplos de código
http://www.java2s.com/Code/Java/Hibernate/CatalogHibernate.htm

Documentação
http://www.hibernate.org/hib_docs/v3/reference/en/html/

Ok, partindo do princípio que você já entendeu como funciona o Hibernate, e o Spring, vamos ao código! +)


Requerimentos:

SpringFramework 2.5 ou superior;
*Vamos baixar o Spring com as dependências, isto é neste arquivo conterá todas as libs que nós podemos por ventura usar com o Spring, como por exemplo as libs do hibernate.

MySql 5.x Instalado;
*Eu estarei usando o pacote apache friends – xampp

MySql JConnector 5.x.x;

Conhecimentos básicos sobre MySql;

Plugin Eclipse SpringIDE;
*
Opcional

Plugin Eclipse Hibernate Tools 3.2.x;
*Opcional

Instale os plugin’s estes opcionais na verdade este artigo não fará uso deles, mas pensando no futuro seria interessante fazer uso deles.

Após isso, abra seu projeto no Eclipse que nós tinhamos criado anteriormente, O JavaFlex.

Vamos adicionar as seguintes libs ao projeto na pasta JavaFlexWebContentWEB-INFlib:

Library

*A maioria das libs podem ser encontrada no arquivo compactado que você baixou do Spring. Lembrando também que o modelo de estilo de projeto criado no Eclipse, Dynamic Web Project, já adiciona automaticamente ao Classpath do projeto ao você colar as libs nesta pasta.

Como nós já tinhamos modelado um caso de uso chamado Cargo, vamos agora criar um banco de dados para o nosso pequeno sistema.

Abra seu MySql, e execute este script sql que criará a base de dados chamada JavaFlex, e também a tabela JAVAFLEX_CARGO;


--
-- Banco de Dados: `javaflex`
--
CREATE DATABASE `javaflex` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USE `javaflex`;

--
-- Estrutura da tabela `javaflex_cargo`
--

CREATE TABLE `javaflex_cargo` (
  `ID_CARGO` int(10) unsigned NOT NULL auto_increment,
  `DS_CARGO` varchar(50) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`ID_CARGO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Entendendo os Pacotes, e configurando a persistência

Com o banco de dados criado, vamos mapear a tabela no banco, com o nosso Entity Cargo, para isso, crie um package chamado:

com.digows.artigos.JavaFlex.model.repository.hibernate.hbm

Neste package irá conter todos os nossos mapeamentos em xml, alguns preferem fazer uso de annotations, só que pessoalmente não gosto de acoplar códigos de annotations em meus beans de negócio, prefiro delegar a função Mapeamento a arquivos xml’s.

Neste mesmo package crie um arquivo chamado Cargo.hbm.xml, e adicione o seguinte conteúdo:

Cargo.hbm.xml

[xml]

[/xml]

Perceba que estamos mapeando nosso entity Cargo que foi criado no post anterior com a tabela  JAVAFLEX_CARGO criada recém.

com.digows.artigos.JavaFlex.model.repository.hibernate

Este package irá conter classes que implementam o Pattern DAO usando o Hibernate. Métodos de CRUD e querys em geral usando o Hibernate deverão estar neste pacote estes separados por casos de uso.

Neste mesmo package, vamos criar um DAO usando o hibernate para o nosso entity cargo, para isso, crie uma classe java chamada CargoHibernateDao,  e adicione o seguinte conteúdo:

CargoHibernateDao.java

[java]

package com.digows.artigos.JavaFlex.model.repository.hibernate;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.digows.artigos.JavaFlex.model.entity.Cargo;
import com.digows.artigos.JavaFlex.model.repository.CargoRepository;

@Repository(value=”cargoRepository”)
public class CargoHibernateDao extends HibernateDaoSupport
implements CargoRepository {

@Autowired
public CargoHibernateDao(@Qualifier(“sessionFactory”)SessionFactory factory) {
super.setSessionFactory(factory);
}

public Cargo save(Cargo p_cargo) {
getHibernateTemplate().saveOrUpdate(p_cargo);
return p_cargo;// ID POPULADA
}

public void remove(Cargo p_cargo) {
getHibernateTemplate().delete(p_cargo);
}

public Cargo findById(Cargo p_cargo) throws Exception {
long id = p_cargo.getIdCargo();
p_cargo = (Cargo) getHibernateTemplate().get(Cargo.class, p_cargo.getIdCargo());

if (p_cargo == null)
throw new Exception(“O Cargo com a ID: “+id+” do(a) “+Cargo.class.getSimpleName()+” não foi encontrada.”);
return p_cargo;
}

@SuppressWarnings(“unchecked”)
public List getList() {
return (List) getHibernateTemplate().loadAll(Cargo.class);
}
}

[/java]

Perceba que esta implementa apenas métodos de acesso ao banco de dados usando o hibernate. Nesta classe faço uso de annotations para que o container Spring faça o wire dos beans.

@Repository

A anotação @Repository é mais um estereótipo que foi introduzido no Spring 2.0. Esta anotação é usada para indicar que uma classe funciona como um repositório (Veremos mais adiante o que é este pattern), esta anotação faz com que o Spring envie Exceptions da persistência a camada de serviço, vindas de DataAccessException, isto é deixa tranparênte a camada de serviço o tipo de repository que foi implementado.

@Autowired

A anotação @Autowired é usada para a injeção de depêndencia da sessionFactory do hibernate.

@SuppressWarnings

Faço uso da anotação @SuppressWarnings, apenas para o compilador não gerar um Warning no cast da List, uma vez que o Hibernate foi projetado sem o uso de Generics, ao usar Generics o compilador devolve um Warning.

Perceba que esta classe implementa uma interface, está interface implementa o pattern Repository, este padrão já causou muita polêmica em forums Java como o GUJ por exemplo, recomendo a leitura deste post para entender o padrão:
http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/

com.digows.artigos.JavaFlex.model.repository

Este package irá conter interfaces do tipo repository que dará comportamentos a DAO’s sejam elas implementadas por DAO’s Hibernate, DAO’s JDBC, DAO’s iBatis e etc…

Neste mesmo pacote, crie uma interface chamada CargoRepository com o seguinte conteúdo:

CargoRepository.java

[java]

package com.digows.artigos.JavaFlex.model.repository;

import java.util.List;
import com.digows.artigos.JavaFlex.model.entity.Cargo;

public interface CargoRepository {

void remove(Cargo p_cargo);
Cargo save(Cargo p_cargo);
Cargo findById(Cargo p_cargo) throws Exception;
List getList();
}

[/java]

Ok! nossa persistência já foi programada, vamos agora alterar a classe CargoService que foi criado no post anterior, para que se comporte como uma classe de serviço gerenciada pelo container Spring.

Para isso, altere o nome da classe CargoService que está no package com.digows.artigos.JavaFlex.model.service para CargoServiceImpl e adicione este conteúdo:

CargoServiceImpl.java

[java]

package com.digows.artigos.JavaFlex.model.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.digows.artigos.JavaFlex.model.entity.Cargo;
import com.digows.artigos.JavaFlex.model.repository.CargoRepository;

@Service(value=”cargoService”)
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public class CargoServiceImpl implements CargoService {

private CargoRepository cargoRepository;

@Autowired
public void setCargoRepository(CargoRepository cargoRepository) {
this.cargoRepository = cargoRepository;
}

public Cargo save(Cargo p_cargo) throws Exception {
try {
this.cargoRepository.save(p_cargo);
return p_cargo;
} catch (Exception e) {
throw new Exception(“Não foi possível salvar.” +e.getCause());
}
}

public void remove(Cargo p_cargo) throws Exception {
try {
this.cargoRepository.remove(p_cargo);
} catch (Exception e) {
throw new Exception(“Não foi possível excluir.” +e.getMessage());
}
}

public Cargo findById(Cargo p_cargo) throws Exception {
try {
return this.cargoRepository.findById(p_cargo);
} catch (Exception e) {
throw new Exception(“Não foi possível procurar pela ID.”+e.getMessage());
}
}

public List getList() throws Exception {
try {
return this.cargoRepository.getList();
} catch (Exception e) {
throw new Exception(“Não foi possível listar.”+e.getMessage());
}
}
}

[/java]

Perceba que é uma classe de serviço simples, esta apenas tem a funcão de coodernar os Entities de domínio e fazer a persistência atráves de um repository.

@Service

A anotação @Service é uma forma especializada da anotação @Component. É conveniente anotar as classes da camada de serviço com @Service para facilitar o processamento por ferramentas ou antecipar qualquer futuro serviço de capacidades específicas que podem ser adicionados a esta anotação.

@Transactional

Como o próprio nome diz, é um estereótipo que delega ao container que esta classe de serviço deve ser transicional.

@Autowired

A anotação @Autowired é usada para a injeção de depêndencia que será feita pelo container de uma implementação da interface CargoService.

Nessa camada de serviço faço uso também do Pattern DIP (Dependency Inversion Principle), por isso esta classe é uma implementação (CasoDeUsoServiceImpl) de uma interface de serviço, no caso a CargoService.

Para isso no pacote com.digows.artigos.JavaFlex.model.service, crie uma interface com o nome de CargoService, com este conteúdo:

CargoService.java

[java]

package com.digows.artigos.JavaFlex.model.service;

import java.util.List;

import com.digows.artigos.JavaFlex.model.entity.Cargo;

public interface CargoService {

void remove(Cargo p_cargo) throws Exception;
Cargo save(Cargo p_cargo) throws Exception;
Cargo findById(Cargo p_cargo) throws Exception;
List getList() throws Exception;
}

[/java]

Ok, com estes passos realizados, já concluímos a implementação do nosso model. A estrutura final deverá ser esta:

image

Configurando o SpringFramework com o Hibernate e o Blaze.

No post anterior, configuramos o Tomcat para utilizar apenas o BlazeDS, agora precisamos adicionar mais as configurações  do SpringFramework.

Para isso abra o arquivo JavaFlexWebContentWEB-INFweb.xml e altere deixando com este conteúdo:

web.xml

[xml]

JavaFlex

contextConfigLocation

/WEB-INF/applicationContext.xml

org.springframework.web.context.ContextLoaderListener

org.springframework.web.context.request.RequestContextListener

flex.class.path
/WEB-INF/flex/hotfixes

MessageBrokerServlet
MessageBrokerServlet

flex.messaging.MessageBrokerServlet

services.configuration.file
/WEB-INF/flex/services-config.xml

flex.write.path
/WEB-INF/flex

1

MessageBrokerServlet
/messagebroker/*

index.html
index.htm
index.jsp

[/xml]

Perceba na configuração do Spring, ele faz referência a um arquivo chamado applicationContext.xml, este arquivo é o que contém as configurações do Spring em si, então no mesmo diretório que se econtra o web.xml, crie um arquivo com o nome de applicationContext.xml e coloque este conteúdo:

applicationContext.xml

[xml]

${jdbc.driverClassName}

${jdbc.url}

${jdbc.username}

${jdbc.password}

classpath:com/digows/artigos/JavaFlex/model/repository/hibernate/hbm/

org.hibernate.dialect.MySQLInnoDBDialect

true
<!–
Atualizar o Banco de dados de acordo com os arquivos de mapeamentos.
update
–>


[/xml]

Perceba que as configurações do banco de dados usado, delego a um arquivo .properties, também vou precisar configurar o log4j para a impressão de log’s. Por estética o bacana seria gerar um novo source-path que contenha tais arquivos properties.

Crie um pasta na raiz do projeto com o nome de resources,

De um botão direito sobre o projeto e clique em properties;

Em Java Build Path, clique no botão AddFolder;

Selecione a pasta resources, clique em ok, e marque a opção Allow output folders for source folders, e ok.

Dentro do package resources, crie um arquivo chamado jdbc.properties, e adicione o seguinte conteúdo:

jdbc.properties


# Properties file com as configuracoes do JDBC.
# Aplicado pelo PropertyPlaceholderConfigurer do Spring

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaflex
jdbc.username=root
jdbc.password=

#Properties que determina o dialeto do Banco de Dados.
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

e outro arquivo chamado log4j.properties com este conteúdo:

log4j.properties


### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# set root logger level to debug and its only appender to mtf
log4j.rootLogger=INFO,development

# only for development purposes
log4j.appender.development=org.apache.log4j.ConsoleAppender
log4j.appender.development.layout=org.apache.log4j.PatternLayout
log4j.appender.development.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] (%F:%L) - %m%n

log4j.logger.noModule=FATAL
log4j.logger.org.springframework=WARN

# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=DEBUG

Uma outra modificação é necessária, está a mais importante, pois delega ao Blaze, que existe uma factory de beans criada pelo Spring.

Essa factory deve ser implementada, porém já existe pronto na internet para uso, esta pode ser encontrada aqui:

Spring and Flex Integration Factory Class

Baixe ela, e coloque por exemplo neste pacote:

com.digows.artigos.JavaFlex.controller

*O  nome controller ficou sugestivo aqui, uma vez que está factory não tem comportamentos de um controller, porém como o Flex não faz uso do controller para controlar as actions que também não existe, achei bacana preservar o package colocando a factory de beans do Spring que será usada pelo Blaze neste pacote. Se alguém tiver uma idéia melhor de onde colocar a classe, estou aceitando opniões.

Vamos então configurar o Blaze. Abra o arquivo JavaFlexWebContentWEB-INFflexservices-config.xml e altere deixando com este conteúdo:

services-config.xml

[xml]

false

[BlazeDS]
true
false
true
true

Endpoint.*
Service.*
Message.*
DataService.*
Configuration

true
20

{context.root}/WEB-INF/flex/services-config.xml

{context.root}/WEB-INF/flex/remoting-config.xml

{context.root}/WEB-INF/web.xml

[/xml]

Perceba que mapeio o local da Factory. Agora é preciso atualizar nosso servico cargoService dentro do arquivo JavaFlexWebContentWEB-INFflexremoting-config.xml. Então abra e edite deixando com este conteúdo:

remoting-config.xml

[xml]

spring
cargoService

[/xml]

Aqui só é importante observar que a tag <source /> mapeia o nome do bean do tipo serviço que foi delegado na annotation, no nosso caso na classe CargoServiceImpl perceba a annotation @Service(value=”cargoService”) e também a tag <factory /> que faz referência a configuração no arquivo services-config.xml

Se tudo foi efetuado corretamente, ao você dar um botão direito no projeto e ir em Run As -> Run On Server, ao clicar em salvar no fomulário de cadastro criado no post anterior, o seu objeto cargo vindo do Flex já será persistido! observe o console para isso.

Eu alterei o arquivo comdigowsartigosJavaFlexviewscreenCargoForm.mxml para que possa usar todos os métodos do CRUD Cargo. Segue como ficou:

CargoForm.mxml

[xml]

[/xml]

image

Bom pessoal, acredito que com estes 2 artigos consegui atingir o objetivo de dar a comunidade Java uma proposta de interface produtiva e poderosa, e também a comunidade Flex uma proposta de uma arquitetura com Flex e Java, utilizando o Blaze Data Services.

Faça mais testes, veja que o desenvolvimento é muito rápido! muito melhor do que se matar com tags html e funções em JavaScript.

Fora que você pode desenvolver com o Flex aplicando os conceitos de Orientação a Objetos, a começar pela tranferência de dados, no Flex chega Objetos! e não textos (XML, WebServices, Request/Response e afins).

Neste artigo não fiz uso de patterns para o desenvolvimento das telas em Flex, porém nos próximos artigos irei abordar detalhadamente como você pode arquiteturar seu código Flex visando ganhar manutenabilidade, escalabilidade, e reusabilidade.

Tópico no Forum que contém detalhes sobre o download. Flex 2.0 e Flex 3.0
[Link]

Obrigado a todos e um Beijão especial para minha querida Liz!

=*****

Abraços

o/

120 thoughts on “Integrando Adobe Flex + BlazeDS + SpringFramework + Hibernate – Uma Solução OpenSource para Sistemas Web. (Parte 2 – Final)

  1. Rodrigo Pereira Fraga

    Bom.. você não especificou seu problema… mas segue lah um exemplo:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { “classpath:applicationContext-tests.xml” })
    public class NivelUsuarioControlImplTests extends AbstractDependencyInjectionSpringContextTests
    {
    @Autowired
    private NivelUsuarioAppService nivelUsuarioAppService;
    private NivelUsuario nivelUsuario;

    @Test
    public void testSave()
    {
    this.nivelUsuario = new NivelUsuario();
    this.nivelUsuario.setDsNivelUsuario(“Usuario”);
    assertEquals(nivelUsuario, nivelUsuarioAppService.save(nivelUsuario));
    }

    @Test
    public void testList()
    {
    List list = (List) nivelUsuarioAppService.getAll();
    for (NivelUsuario nivelUsuario : list)
    {
    System.out.println(” ID: ” + nivelUsuario.getIdNivelUsuario() + ” -> ”
    + nivelUsuario.getDsNivelUsuario());
    }
    }
    }

    Like

    Reply
  2. Araújo Jr.

    Olá rodrigo, em primeiro lugar, gostaria de parabenizá-lo pelo artigo, sem dúvida não há nada no google com o grau de detalhe que você colocou aqui. Eu fiquei bastante maravilhado com o spring li todas as referencias que você deixou como base preparatória para o artigo, mas confesso que não entendi duas coisas.
    1 – @Repository(value=”cargoRepository”)eu vasculhei todo o código várias e várias vezes mas não encontrei referencia para o “cargoRepository”.
    2 –
    @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
    achei até um link relacionado
    http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/transaction/annotation/Transactional.html
    mas confesso que não compreendi a utilidade deste annotation.

    Um grande abraço.

    Like

    Reply
  3. Rodrigo Pereira Fraga

    Olá Araújo,

    Bom, quanto a suas dúvidas, a annotation:
    @Repository(value=”cargoRepository”)

    É apenas um stereotype que denota que a classe implementa um Repositório. O value agregado a ela, é apenas um nome dado a este Bean.
    No caso apresentado realmente não faz uso, mas se em algum momento eu quizer fazer um lockup neste bem, eu somente solicito esta “ID”.
    Imagine se por ventura vc tivesse 2 implementaçoes de banco de dados do mesmo caso de uso, seria util denotar a ID para quando injetar no service, injetar a implementação desejada.

    Quanto a @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class), é a annotation que denota Transacao, isto eh todo o fluxo inciado em qualquer método será transicional, a propagação será sempre requerida, e fará rollback quando uma exception do tipo Exception for levantada.
    O conceito aplicado a esta annotation é o mesmo quando se trata de transação. Recomendo pesquisar sobre transações, e saber usar as devidas propagações.

    Abraços e bons estudos.

    Like

    Reply
  4. Najib

    hi,
    thinks you a lot for this great tutorial
    i have one question mm two questions:

    1: how can i deploy this application with jboss 4.2.2 ?

    2:how can i migrate to postgresql ?
    i am newbe in flex and blazeds thinks …

    Like

    Reply
  5. Najib

    oura !!
    i have resolved that i can now use postgresql just you have to change cargo.hbm.xml to :

    and change in the cargo class the id to be int ,not long and change all of other class and interface the id to be int and not long (sorry i don’t speak english very well but you can understand me of course !!)
    if you don’t understand me i can speak french !! 🙂

    Like

    Reply
  6. Najib

    sorry the file wasn’t displayed !!
    in cargo.hbm.xml change to this :

    id name=”idCargo” column=”id_cargo” type=”integer”
    and the generator must be class=”increment”

    the upper letter must be lower in your database and you must change the jdbc.properties to change driver and others urls,

    Like

    Reply
  7. Rene Vielma

    Hello.
    I’m follow your steps, but I got next exception:

    INFO: Server startup in 5339 ms

    [BlazeDS] 05/13/2008 [ERROR] [Message.General] Exception when invoking service: remoting-service
    with message: Flex Message (flex.messaging.messages.RemotingMessage)
    operation = getList
    clientId = 37AB9285-5C0A-9144-4B42-4D37058CBF48
    destination = cargoService
    messageId = ACAAB8F1-C177-E376-0260-E4D4D05A5F90
    timestamp = 1210724962588
    timeToLive = 0
    body = null
    hdr(DSId) = 37AB9226-2508-D765-4011-3CB5687F9CF0
    hdr(DSEndpoint) = my-amf
    exception: flex.messaging.MessageException: java.lang.NullPointerException

    [BlazeDS] 05/13/2008 [ERROR] [Message.General] Root cause: java.lang.NullPointerException
    at com.digows.artigos.JavaFlex.controller.SpringFactory$SpringFactoryInstance.lookup(SpringFactory.java:125)
    at flex.messaging.services.remoting.adapters.JavaAdapter.createInstance(JavaAdapter.java:475)
    at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:395)
    at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)
    at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1417)
    at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:878)
    at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:121)
    at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)
    at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:49)
    at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)
    at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:146)
    at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:274)
    at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:377)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)

    [BlazeDS] 05/13/2008 [ERROR] [Message.General] Error handling message: flex.messaging.MessageException: java.lang.NullPointerException
    incomingMessage: Flex Message (flex.messaging.messages.RemotingMessage)
    operation = getList
    clientId = 37AB9285-5C0A-9144-4B42-4D37058CBF48
    destination = cargoService
    messageId = ACAAB8F1-C177-E376-0260-E4D4D05A5F90
    timestamp = 1210724962588
    timeToLive = 0
    body = null
    hdr(DSId) = 37AB9226-2508-D765-4011-3CB5687F9CF0
    hdr(DSEndpoint) = my-amf
    errorReply: Flex Message (flex.messaging.messages.ErrorMessage)
    clientId = 37AB9285-5C0A-9144-4B42-4D37058CBF48
    correlationId = ACAAB8F1-C177-E376-0260-E4D4D05A5F90
    destination = cargoService
    messageId = 37AB929B-550A-6236-7645-50B50B9742F7
    timestamp = 1210724962597
    timeToLive = 0
    body = null
    code = Server.Processing
    message = java.lang.NullPointerException
    details = null
    rootCause = java.lang.NullPointerException
    body = null
    extendedData = null

    any idea ?

    thanks you !

    Like

    Reply
  8. Bruno Queiroz

    Rodrigo, talvez vc saiba…estou usando aquele @transaction do Spring mas nao consigo faze-lo funcionar junto ao flex. Quando coloco a anotacao no escopo de classe ou metodo, o flex nao encontra os meus metodos do meu service, mas caso eu tire, funciona blzinha.

    details: Method ‘obterPorCPF’ not found.

    Like

    Reply
  9. Valber Carreiro

    Olá Rodrigo, venho dando uma estudada em flex através dos seus totos, daí estou cm uma dúvida quanto ao seguinte ponto, por exemplo na minha classe service se eu criar um método de login colocando como tipo de retorno um FlexForward, depois de fazer as validações de login como poderia encaminhar o retorno para uma página inicial? Pq estou tentando fazer o retorno dando um “return findForward(flexForward, HOME);” onde esse “felxForward” é uma instância da FlexForward e home seria a página que deveria ser apresentada caso a operação fosse bem sucedida, porém, após digitar o login e a senha e confirmar a operação nada acontece, ou seja, não acontece o redirecionamento para a página principal.
    Vc teria alguma dica de como devo fazer esse forward ou teria alguma indicação de material para que eu pudesse dar uma olhada e ver se encontro o que estou procurando?
    Desde já agradeço.

    Like

    Reply
  10. Valber Carreiro

    Rodrigo, só complementando o post anterior… o que eu quero saber na verdade é como fazer esse redirecionamento para a página principal a partir do java depois da validação de um login por exemplo?
    vlw

    Like

    Reply
  11. Eremim

    Deu um erro no meu projeto.

    erro:
    SEVERE: Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.LocalSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError

    na linha:
    super.setSessionFactory(factory);
    do CargoHibernateDao.java

    Deu a seguinte mensagem:
    The type org.hibernate.SessionFactory cannot be resolved. It is indirectly referenced from required .class files

    Alguem pode me ajudar?

    Like

    Reply
  12. Flávio

    Eu criei uma função que faz uma pesquisa de membros de um projeto que pertencem a um projeto usando essa função:

    Código: Selecionar tudo
    —-
    public MembroProjeto getMembroProjetoByProjeto(Projeto projCodigo){
    MembroProjeto membroProjeto = (MembroProjeto) getSession().createQuery(“” +
    “FROM br.com.teamwork.model.entity.MembroProjeto WHERE projCodigo =”+projCodigo.getProjCodigo()).list();
    return membroProjeto;
    }
    —-

    O problema é que ela pelo jeito foi feita para retornar apenas 1 item e não vários, como eu faço para ele retornar vários dados? Pois se o projeto tiver apenas um membro ele vai sem problema, senão ele dá pau. Outra coisa, eu tive que trocar o tipo do list de ArrayCollection para Object, senão dá pau

    Como faço para arrumar isso?
    Estou quase no final do TCC e é só isso que falta

    Like

    Reply
  13. Pingback: Leonardo França » Adobe Flex e Java

  14. aaron

    faultCode:Server.Processing faultString:’No destination with id ‘cargoService’ is registered with any service.’ faultDetail:’null’

    hello anyone can help I really need to solve it. thanks

    Like

    Reply
  15. Wesley

    Desculpa, esse eh o erro:

    faultCode:Client.Error.MessageSend faultString:’Send failed’ faultDetail:’Channel.Security.Error error Error #2048 url: ‘http://localhost/JavaFlex/messagebroker/amf”

    Obrigado

    Like

    Reply
  16. Wesley

    Rodrigo, abaixo o stacktrace que ta aparecendo no console do eclipse.
    Estou começando e estou com um pouco de dificuldade pra rodar essa aplicação.

    10/01/2009 19:09:45 org.apache.catalina.loader.WebappClassLoader validateJarFile
    INFO: validateJarFile(C:Documents and SettingsWesleyMy DocumentsFlex Builder 3.metadata.pluginsorg.eclipse.wst.server.coretmp0wtpwebappsJavaFlexWEB-INFlibservlet-api.jar) – jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
    java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found
    at javax.xml.parsers.SAXParserFactory.newInstance(Unknown Source)
    at org.apache.tomcat.util.digester.Digester.getFactory(Digester.java:500)
    at org.apache.tomcat.util.digester.Digester.getParser(Digester.java:705)
    at org.apache.tomcat.util.digester.Digester.getXMLReader(Digester.java:979)
    at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1644)
    at org.apache.catalina.startup.TldConfig.tldScanStream(TldConfig.java:518)
    at org.apache.catalina.startup.TldConfig.tldScanJar(TldConfig.java:476)
    at org.apache.catalina.startup.TldConfig.execute(TldConfig.java:301)
    at org.apache.catalina.core.StandardContext.processTlds(StandardContext.java:4448)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4248)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    … 6 more

    Obrigado!

    Like

    Reply
  17. Fabrício

    Estou utilizando eclipse com o flex 3 sdk. No entanto, no exemplo do tutorial, tive um problema ao rodar a aplicação. Exibi-se a mensagem de erro abaixo:

    faultCode:InvokeFailed faultString:'[MessagingError message=’Destination ‘cargoService’ either does not exist or the destination has no channels defined (and the application does not define any default channels.)’]’ faultDetail:’Couldn’t establish a connection to ‘cargoService”

    Alguém consegue me ajudar?

    Like

    Reply
  18. Adriano

    Olá Rodrigo,
    Estou usando um exemplo que encontrei na documentação do Hibernate e simplesmente estacionei… 😦
    Lá eu implemento um Cachorro que tem um Dono, sendo assim criei a classe Dono normalzinha com idDono e nomeDono e na classe Cachorro criei um idCachorro, nomeCachorro e dono do tipo Dono.
    Acontece que quando busco um Cachorro no flex ele vem com o idCachorro e nomeCachorro mas o dono vem null, como faria pra contornar isso? É possivel acessar o método getDono() do bean Cachorro diretamente pelo Flex para injetar o dono ao Cachorro? Seria uma boa prática criar um método na classe Service pra fazer isso (Creio que não)?
    Obs: Se uso eager retorna, mas quando a quantidade de registros aumentar vai ficar muito pesado, então a alternativa seria lazy mesmo…

    Muito obrigado pela Ajuda!

    Like

    Reply
  19. André

    Ola Rodrigo,

    Estou trabalhando em um software open source, sera um e commerce, desenvolvido em flex e java, entre outros frameworks, estamos usando cairngorm, hibernate, e spring framework, porem um problema que tivemos, é que sempre que preciso retornar algo do java para o flex, eu recebe um objeto nulo!, as classes estamo mapeadas corretamente com [RemoteClass], nao sei o que pode estar acontecendo… sera algum problema na SpringFactory? mas interessante é que quando envio algo do blaze para o java, ele recebe perfeitamente bem, pois consigo cadastrar usuarios normalmente, e antes de enviar o objeto de volta para o flex, eu testo ele fazendo um print nos campos, e o objeto nao esta nulo! porem chega no nulo no flex, na verdade estou usando um responder para tratar as requisicoes, e como elas chegam no formato object, tenho que fazer um cast para o meu tipo especifo, porem fazendo um try catch no flex, ele me retorna o erro #1009 que diz que nao posso acessar uma propriedade de um objeto nulo, hora essa que eu iria armazenar o usuario no model locator, ou qualquer outra operacao com o usuario recebido, se souber do que se trata ou do que poderia ser, poderia me avisar? fico Agradecido, muito bom o material

    Like

    Reply
  20. Junior

    Ola Rodrigo, estou seguindo o tutorial conforme esta escrito, o meu aplicativo carrega no browser normalmente, porém quando salvo as informações, esta me dando este erro:
    faultCode:Server.Processing faultString:’org.springframework.transaction.CannotCreateTransactionException : Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection’ faultDetail:’null’faultDetail:’null’hibernate.CargoHibernateDao]

    Como resolvo isso?

    Desde já agradeço

    Like

    Reply
  21. Junior

    Boa Tarde Rodrigo!

    terminei o tuto, só que novamente um erro esta acontecendo, quando eu vou salvar as informações este erro acontece:
    faultCode:Server.Processing faultString:’java.lang.Exception : Não foi possível salvar.org.hibernate.MappingException: Unknown entity: com.digows.artigos.JavaFlex.model.entity.Cargo’ faultDetail:’null’

    o que pode ser isso? como resolver?

    Desde já agradeço

    Like

    Reply
  22. Fábio Junior

    Ajuda ao Junior

    O seu problema esta relacionado a não existência da tabela javaflex_cargo.

    Primeiramente confira se as informações da sua base de dados estão corretas no arquivo jdbc.properties.

    No seu SGBD crie uma tabela chamada javaflex_cargo com os seguintes atributos:

    ID_CARGO: Int
    DS_CARGO:VARCHAR

    Abraço;

    Like

    Reply
  23. Jon

    Não teria como disponibilizar o codigo fonte do projeto, com a segunda parte?
    Estou seguindo o tutorial, mas me deparei com alguns erros, quanto tento executar

    Like

    Reply
  24. pablo.borges

    Olá Pessoal,

    Rodrigo,

    Estou com a mesma dúvida do R.B., onde eu devo colocar as minhas regras de négocio?

    as classes services como dito no artigo, são apenas fachadas para obter acesso a determinada funcionalidades e ela esta anotada com o stereotype @Service. È as minhas regras de negócio devo colocar aonde? Pois o BLAZEDS ira chamar as minhas services, que estão mapeadas no remote-config.xml. È as minhas services? eu chamo as minhas regras de négocio? e a minhas regras de negocio chamam a minha DAO. É isso?
    Como eu devo anotar as minhas regras de négocio? Pois no spring so tem os stereotype´s @Controller, @Repository, @Service, etc.

    então as chamadas ficariam assim:

    flex->service->business->repository?

    Se pudesse dar um ex.

    Obrigado.

    Like

    Reply
  25. Anderson Pereira

    Assim que abre o formulário aparece este erro

    faultCode:Client.Error.MessageSend faultString:’Send failed’ faultDetail:’Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 404: url: ‘http://localhost:8080/WebContent/messagebroker/amf”

    Like

    Reply
  26. Pingback: TUTORIAL JAVA + FLEX NA PRÁTICA 1/6 | SaberProgramar.com

  27. Francisco Santos

    Rodrigo, primeiramente parabéns pelo tutorial muito bom msm… mas estou passando por um prob, estou usando o tomcat 6.0.18, eclipse europa, e flex 3, ao startar o tomcat dispara esse erro:

    2009-05-21 08:18:05 ERROR [main] (ContextLoader.java:215) – Context initialization failed
    org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 11 in XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element ‘beans’.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element ‘beans’.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:382)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1944)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:330)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(XMLNSDocumentScannerImpl.java:779)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1794)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:250)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
    … 28 more
    21/05/2009 08:18:05 org.apache.catalina.core.StandardContext listenerStart
    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 11 in XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element ‘beans’.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element ‘beans’.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:382)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1944)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:330)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(XMLNSDocumentScannerImpl.java:779)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1794)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:250)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
    … 28 more
    21/05/2009 08:18:05 org.apache.catalina.core.StandardContext start
    SEVERE: Error listenerStart
    21/05/2009 08:18:05 org.apache.catalina.core.StandardContext start
    SEVERE: Context [/JavaFlex] startup failed due to previous errors

    application.xml:

    ${jdbc.driverClassName}

    ${jdbc.url}

    ${jdbc.username}

    ${jdbc.password}

    classpath:br/com/digows/artigos/JavaFlex/model/repository/hibernate/hbm/

    org.hibernate.dialect.MYSQLInnoDBDialect

    true
    <!–
                Atualizar o Banco de dados de acordo com os arquivos de mapeamentos.
                update
              –>

    vc pode me ajudar? Desde já agradeço

    Like

    Reply
  28. Francisco Santos

    application.xml:

    ${jdbc.driverClassName}

    ${jdbc.url}

    ${jdbc.username}

    ${jdbc.password}

    classpath:br/com/digows/artigos/JavaFlex/model/repository/hibernate/hbm/

    org.hibernate.dialect.MYSQLInnoDBDialect

    true
    <!–
                Atualizar o Banco de dados de acordo com os arquivos de mapeamentos.
                update
              –>

    Like

    Reply
  29. Pedro Silva

    Muito Massa o artigo Rodrigo!!

    Uma duvida. No metodo save quando crio um novo objeto (cargo) sem passar o valor de idCargo, o flex sempre envia este atributo preenchido com 0 (zero)isso é constante ou porque ele é do tipo Number. E tambem nao consegui pegar o valor passado diretamente pro atributo no FormCargo.mxml ele sempre mostra NaN. Se puder dar uma luz fico agradecido..

    Parabéns!!
    Um forte abraço.

    Like

    Reply
  30. Leandro angelO

    Rodrigo show de bola o/

    brother sou extremamente iniciante em Java e Flex…

    to com um probleminha nessa linha, fica aparecendo aquele “x” vermelho, voce sabe o que pode ser ?

    flex.messaging.FlexContext.getServletConfig()

    valew té mais…

    Like

    Reply
  31. Vinicius Sotti

    Rodrigo li seu artigo na JM, muito bom.
    Precisava muito executar essa aplicação do seu tutorial para usar como exemplo em um trabalho da minha faculdade. Porém ja segui o tutorial completo 2 vezes e encontrei o mesmo erro, gostaria de saber se voce pode me ajudar.

    É isso que aparece no console:
    17/06/2009 17:34:43 org.apache.catalina.core.AprLifecycleListener init
    INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:Program FilesJavajre6bin;.;C:WindowsSunJavabin;C:Windowssystem32;C:Windows;C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Program FilesCommon FilesAheadLib
    17/06/2009 17:34:43 org.apache.coyote.http11.Http11Protocol init
    INFO: Initializing Coyote HTTP/1.1 on http-8400
    17/06/2009 17:34:43 org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 853 ms
    17/06/2009 17:34:43 org.apache.catalina.core.StandardService start
    INFO: Starting service Catalina
    17/06/2009 17:34:43 org.apache.catalina.core.StandardEngine start
    INFO: Starting Servlet Engine: Apache Tomcat/6.0.14
    17/06/2009 17:34:44 org.apache.catalina.core.ApplicationContext log
    INFO: Initializing Spring root WebApplicationContext
    2009-06-17 17:34:44 ERROR [main] (ContextLoader.java:215) – Context initialization failed
    org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:295)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:97)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:411)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:338)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3830)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4337)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
    at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:101)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:321)
    … 27 more
    17/06/2009 17:34:44 org.apache.catalina.core.StandardContext listenerStart
    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:295)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:97)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:411)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:338)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3830)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4337)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
    at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:101)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:321)
    … 27 more
    17/06/2009 17:34:44 org.apache.catalina.core.StandardContext start
    SEVERE: Error listenerStart
    17/06/2009 17:34:44 org.apache.catalina.core.StandardContext start
    SEVERE: Context [/JavaFlex] startup failed due to previous errors
    17/06/2009 17:34:44 org.apache.catalina.core.ApplicationContext log
    INFO: Closing Spring root WebApplicationContext
    17/06/2009 17:34:45 org.apache.coyote.http11.Http11Protocol start
    INFO: Starting Coyote HTTP/1.1 on http-8400
    17/06/2009 17:34:45 org.apache.jk.common.ChannelSocket init
    INFO: JK: ajp13 listening on /0.0.0.0:8009
    17/06/2009 17:34:45 org.apache.jk.server.JkMain start
    INFO: Jk running ID=0 time=0/33 config=null
    17/06/2009 17:34:45 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 1407 ms

    Desde já agradeço.

    Like

    Reply
  32. Vinicius Sotti

    a parte que o eclipse identifica como errado é nessa linha:
    MessageBrokerServlet
    no arquivo web.xml

    e nessa:
    @Repository(value=”cargoRepository”)
    no CargoHibernateDao.java

    Se puder me ajudar, agradeço.

    Like

    Reply
  33. Lucas

    Cara, mto show seu tuto. Implementei com algumas modificacoes (to usando hibernate annotations) e esta bombando! soh uma correcao, ao salvar eh preciso testar o idCargo pois por algum motivo que eu ainda nao entendi ele vem com valor “0” do flex para a classe java. Ao tentar persistir o hibernate acaba fazendo update a insert. Ae eh soh setar a variavel para null e correr pro abraco. Show de bola cara, parabens!

    Like

    Reply
  34. Vitor Fernandes

    Cara, vi que este artigo data do mês de janeiro, e estou começando a estudar integração de java + flex agora. Ja programo Flex + PHP5 a um bom tempo. Gostaria que falasse o seguinte:

    Esta forma de programação com estas integrações postas aqui, vc ainda as utiliza? ou mudou alguma coisa desde a data da publicação? Digo isso pq todo dias novas ferramentas e maneiras de integração entre eles mudam. Hoje é recomendado Flex+java seguindo esta estrutura?

    abraço, e exelente artigo cara!

    Like

    Reply
  35. Ricardo

    Muito bom seu artigo
    faultCode:Client.Error.MessageSend faultString:’Send failed’ faultDetail:’Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Failed: url: ‘http://localhost/JavaFlex/messagebroker/amf”
    Nao estou conseguindo resolver esse problema sera que teria como da uma ajuda.

    Like

    Reply
  36. Felipe

    Opa, aconteceu o seguinte erro pra mim, tem alguma ideia de como arrumar?

    cvc-complex-type.2.4.a: Invalid content was found starting with element ‘display-name’. One of ‘{“http://java.sun.com/xml/ns/javaee”:servlet-class, “http://java.sun.com/xml/ns/javaee”:jsp-file}’ is expected. web.xml JavaFlex/WebContent/WEB-INF line 46 XML Problem

    essa linha no web.xml
    MessageBrokerServlet

    Obrigado!!!

    Like

    Reply
  37. Rodrigo Savian

    otimo post Rodrigo.
    Estou começando agora com flex, e ja vi que não é um bixo de 7 cabeças.. hauah

    na hora de executar ele aparece a seguinte mensagem:

    faultCode:Client.Error.MessageSend faultString:’Send failed’ faultDetail:’Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 404: url: ‘http://localhost:8400/JavaFlex/messagebroker/amf”

    como posso resolve-la?
    abraços

    Like

    Reply
  38. Leysson Barbosa Moreira

    Simplesmente um dos melhores tutoriais que eu já encontrei em blogs você está de parabéns cara continue assim.

    Like

    Reply
  39. Romeu Ivolela

    Rodrigo,

    Parabéns pelo tutorial.
    Estamos implementando um projeto novo com as tecnologias java + flex com os frameworks -> cairngorm + blaze + spring + hibernate e seu material está dando uma base legal.
    Fiz o tutorial e rodou certinho, caso alguém tenha alguma dúvida ou precise do projeto zipado, é só entrar em contato.

    Abraços

    Like

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s