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
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=46http://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=6653Spring 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.htmlExemplos de códigos
http://paulojeronimo.com/arquivos/tutoriais/tutorial-spring-framework.zip
http://www.java2s.com/Code/Java/Spring/CatalogSpring.htmDocumentaçã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=4149Outros 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.javaPacotã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.htmDocumentaçã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 - xamppConhecimentos básicos sobre MySql;
Plugin Eclipse SpringIDE;
*OpcionalPlugin 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 JavaFlex\WebContent\WEB-INF\lib:
*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 version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE hibernate-mapping PUBLIC
-
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
<hibernate-mapping>
-
<class name="com.digows.artigos.JavaFlex.model.entity.Cargo"
-
table="javaflex_cargo">
-
-
<id name="idCargo" column="ID_CARGO" type="long">
-
<generator class="native" />
-
</id>
-
-
<property name="dsCargo" column="DS_CARGO" type="string"
-
not-null="true" length="50" />
-
</class>
-
</hibernate-mapping>
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
-
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;
-
-
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);
-
}
-
-
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<cargo> getList() {
-
return (List<cargo>) getHibernateTemplate().loadAll(Cargo.class);
-
}
-
}
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
-
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);
-
List<cargo> getList();
-
}
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
-
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")
-
public class CargoServiceImpl implements CargoService {
-
-
private CargoRepository cargoRepository;
-
-
@Autowired
-
public void setCargoRepository(CargoRepository cargoRepository) {
-
this.cargoRepository = cargoRepository;
-
}
-
-
try {
-
this.cargoRepository.save(p_cargo);
-
return p_cargo;
-
}
-
}
-
-
try {
-
this.cargoRepository.remove(p_cargo);
-
}
-
}
-
-
try {
-
return this.cargoRepository.findById(p_cargo);
-
}
-
}
-
-
try {
-
return this.cargoRepository.getList();
-
}
-
}
-
}
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
-
package com.digows.artigos.JavaFlex.model.service;
-
-
import java.util.List;
-
-
import com.digows.artigos.JavaFlex.model.entity.Cargo;
-
-
public interface CargoService {
-
-
}
Ok, com estes passos realizados, já concluímos a implementação do nosso model. A estrutura final deverá ser esta:
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 JavaFlex\WebContent\WEB-INF\web.xml e altere deixando com este conteúdo:
web.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xmlns="http://java.sun.com/xml/ns/javaee"
-
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-
id="WebApp_ID" version="2.5">
-
-
<display-name>JavaFlex</display-name>
-
-
<!--
-
///////////////////////////////
-
Configuracao Spring 2.5
-
///////////////////////////////
-
-->
-
<context-param>
-
<param-name>contextConfigLocation</param-name>
-
<param-value>
-
/WEB-INF/applicationContext.xml
-
</param-value>
-
</context-param>
-
-
<listener>
-
<listener-class>
-
org.springframework.web.context.ContextLoaderListener
-
</listener-class>
-
</listener>
-
<listener>
-
<listener-class>
-
org.springframework.web.context.request.RequestContextListener
-
</listener-class>
-
</listener>
-
-
<!--
-
///////////////////////////////
-
Configuracao do BlazeDS
-
///////////////////////////////
-
-->
-
<context-param>
-
<param-name>flex.class.path</param-name>
-
<param-value>/WEB-INF/flex/hotfixes</param-value>
-
</context-param>
-
-
<!-- MessageBroker Servlet -->
-
<servlet>
-
<servlet-name>MessageBrokerServlet</servlet-name>
-
<display-name>MessageBrokerServlet</display-name>
-
<servlet-class>
-
flex.messaging.MessageBrokerServlet
-
</servlet-class>
-
<init-param>
-
<param-name>services.configuration.file</param-name>
-
<param-value>/WEB-INF/flex/services-config.xml</param-value>
-
</init-param>
-
<init-param>
-
<param-name>flex.write.path</param-name>
-
<param-value>/WEB-INF/flex</param-value>
-
</init-param>
-
<load-on-startup>1</load-on-startup>
-
</servlet>
-
<servlet-mapping>
-
<servlet-name>MessageBrokerServlet</servlet-name>
-
<url-pattern>/messagebroker/*</url-pattern>
-
</servlet-mapping>
-
-
-
<welcome-file-list>
-
<welcome-file>index.html</welcome-file>
-
<welcome-file>index.htm</welcome-file>
-
<welcome-file>index.jsp</welcome-file>
-
</welcome-file-list>
-
-
</web-app>
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 version="1.0" encoding="UTF-8"?>
-
<beans xmlns="http://www.springframework.org/schema/beans"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xmlns:p="http://www.springframework.org/schema/p"
-
xmlns:context="http://www.springframework.org/schema/context"
-
xmlns:jee="http://www.springframework.org/schema/jee"
-
xmlns:tx="http://www.springframework.org/schema/tx"
-
xsi:schemaLocation="
-
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
-
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
-
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
-
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
-
<!--
-
//////////////////////////////////////
-
Integração do Spring com o Hibernate
-
//////////////////////////////////////
-
-->
-
-
<!--
-
Carregamento do Arquivo de Configuracoes do JDBC
-
-->
-
<context:property-placeholder location="classpath:jdbc.properties" />
-
-
<!--
-
Configuracao do DataSource
-
-->
-
<bean id="dataSource"
-
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
-
<property name="driverClassName">
-
<value>${jdbc.driverClassName}</value>
-
</property>
-
<property name="url">
-
<value>${jdbc.url}</value>
-
</property>
-
<property name="username">
-
<value>${jdbc.username}</value>
-
</property>
-
<property name="password">
-
<value>${jdbc.password}</value>
-
</property>
-
</bean>
-
-
<!--
-
Hibernate SessionFactory
-
-->
-
<bean id="sessionFactory"
-
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
-
-
<property name="dataSource">
-
<ref local="dataSource" />
-
</property>
-
-
<!-- Carrega todos os HBM's -->
-
<property name="mappingDirectoryLocations">
-
<list>
-
<value>
-
classpath:com/digows/artigos/JavaFlex/model/repository/hibernate/hbm/
-
</value>
-
</list>
-
</property>
-
-
<!-- Configuracoes do Hibernate -->
-
<property name="hibernateProperties">
-
<props>
-
<prop key="hibernate.dialect">
-
org.hibernate.dialect.MySQLInnoDBDialect
-
</prop>
-
<prop key="hibernate.show_sql">true</prop>
-
<!--
-
Atualizar o Banco de dados de acordo com os arquivos de mapeamentos.
-
<prop key="hibernate.hbm2ddl.auto">update</prop>
-
-->
-
</props>
-
</property>
-
-
<property name="eventListeners">
-
<map>
-
<entry key="merge">
-
<bean
-
class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
-
</entry>
-
</map>
-
</property>
-
</bean>
-
-
<!--
-
Transaction Manager
-
-->
-
<bean id="transactionManager"
-
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
-
<property name="sessionFactory">
-
<ref local="sessionFactory" />
-
</property>
-
</bean>
-
-
<!-- Habilita os Services para serem transicionais via a Annotation @Transactional -->
-
<tx:annotation-driven transaction-manager="transactionManager" />
-
-
<!-- ============================== AOP DEFINITIONS ================================ -->
-
-
-
<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
-
<!--
-
Activates various annotations to be detected in bean classes:
-
Spring's @Required and @Autowired, as well as JSR 250's @Resource.
-
-->
-
<context:annotation-config />
-
-
<!-- Carrega os Beans de Servico -->
-
<context:component-scan
-
base-package="com.digows.artigos.JavaFlex.model.service" />
-
-
<!-- Carrega os Beans DAO Hibernate -->
-
<context:component-scan
-
base-package="com.digows.artigos.JavaFlex.model.repository.hibernate" />
-
</beans>
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 JavaFlex\WebContent\WEB-INF\flex\services-config.xml e altere deixando com este conteúdo:
services-config.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<services-config>
-
<services>
-
<service-include file-path="remoting-config.xml" />
-
</services>
-
-
<!-- Spring factory registration -->
-
<factories>
-
<factory id="spring"
-
class="com.digows.artigos.JavaFlex.controller.SpringFactory"/>
-
</factories>
-
-
<channels>
-
<channel-definition id="channel-amf"
-
class="mx.messaging.channels.AMFChannel">
-
<endpoint
-
url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
-
class="flex.messaging.endpoints.AMFEndpoint" />
-
<properties>
-
<polling-enabled>false</polling-enabled>
-
</properties>
-
</channel-definition>
-
</channels>
-
-
<logging>
-
<target class="flex.messaging.log.ConsoleTarget"
-
level="Error">
-
<properties>
-
<prefix>[BlazeDS]</prefix>
-
<includeDate>true</includeDate>
-
<includeTime>false</includeTime>
-
<includeLevel>true</includeLevel>
-
<includeCategory>true</includeCategory>
-
</properties>
-
<filters>
-
<pattern>Endpoint.*</pattern>
-
<pattern>Service.*</pattern>
-
<pattern>Message.*</pattern>
-
<pattern>DataService.*</pattern>
-
<pattern>Configuration</pattern>
-
</filters>
-
</target>
-
</logging>
-
-
<system>
-
<redeploy>
-
<enabled>true</enabled>
-
<watch-interval>20</watch-interval>
-
<watch-file>
-
{context.root}/WEB-INF/flex/services-config.xml
-
</watch-file>
-
<watch-file>
-
{context.root}/WEB-INF/flex/remoting-config.xml
-
</watch-file>
-
<touch-file>{context.root}/WEB-INF/web.xml</touch-file>
-
</redeploy>
-
</system>
-
</services-config>
Perceba que mapeio o local da Factory. Agora é preciso atualizar nosso servico cargoService dentro do arquivo JavaFlex\WebContent\WEB-INF\flex\remoting-config.xml. Então abra e edite deixando com este conteúdo:
remoting-config.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<service id="remoting-service"
-
class="flex.messaging.services.RemotingService">
-
-
<adapters>
-
<adapter-definition id="java-object"
-
class="flex.messaging.services.remoting.adapters.JavaAdapter"
-
default="true" />
-
</adapters>
-
-
<default-channels>
-
<channel ref="channel-amf" />
-
</default-channels>
-
-
<destination id="cargoService">
-
<properties>
-
<factory>spring</factory>
-
<source>cargoService</source>
-
</properties>
-
</destination>
-
</service>
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 com\digows\artigos\JavaFlex\view\screen\CargoForm.mxml para que possa usar todos os métodos do CRUD Cargo. Segue como ficou:
CargoForm.mxml
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
-
layout="vertical" width="488" height="384" creationComplete="getList()">
-
-
<mx:Form width="100%" height="100%" defaultButton="{btSalvar}">
-
<mx:FormHeading label="Gerenciamento de Cargos" width="100%"/>
-
<mx:FormItem label="ID:" width="127">
-
<mx:TextInput width="100%" id="txtIdCargo"
-
text="{Cargo(dgCargo.selectedItem).idCargo}" editable="false" enabled="false"/>
-
</mx:FormItem>
-
<mx:FormItem label="Cargo:" width="345">
-
<mx:TextInput width="100%" id="txtDsCargo"
-
text="{Cargo(dgCargo.selectedItem).dsCargo}"/>
-
</mx:FormItem>
-
<mx:DataGrid id="dgCargo" width="100%" height="100%" dataProvider="{listCargos}">
-
<mx:columns>
-
<mx:DataGridColumn headerText="ID" dataField="idCargo" width="30"/>
-
<mx:DataGridColumn headerText="Cargo" dataField="dsCargo"/>
-
</mx:columns>
-
</mx:DataGrid>
-
</mx:Form>
-
-
<mx:ControlBar horizontalAlign="center">
-
<mx:Button label="Novo" click="setDefault()"/>
-
<mx:Button label="Salvar" id="btSalvar" click="save()"
-
textAlign="center"/>
-
<mx:Button label="Excluir" click="remove()"/>
-
</mx:ControlBar>
-
-
<mx:RemoteObject id="cargoService" showBusyCursor="true"
-
fault="onFault(event)" destination="cargoService">
-
<mx:method name="save" result="onResultSave(event)" fault="onFault(event)"/>
-
<mx:method name="remove" result="onResultRemove(event)" fault="onFault(event)"/>
-
<mx:method name="getList" result="onResultGetList(event)" fault="onFault(event)"/>
-
</mx:RemoteObject>
-
-
<mx:Script>
-
<![CDATA[
-
import mx.collections.ArrayCollection;
-
import com.digows.artigos.JavaFlex.view.entity.Cargo;
-
import mx.rpc.events.ResultEvent;
-
import mx.rpc.events.FaultEvent;
-
import mx.controls.Alert;
-
-
[Bindable]
-
private var listCargos:ArrayCollection;
-
-
private var cargo:Cargo;
-
-
public function save():void
-
{
-
this.cargo = new Cargo();
-
this.cargo.idCargo = new Number(txtIdCargo.text);
-
this.cargo.dsCargo = txtDsCargo.text;
-
-
//Chama o metodo Save do servico "cargoService"
-
cargoService.save(cargo);
-
}
-
-
//Função que será executada após a conclusão do método save
-
public function onResultSave(event:ResultEvent):void
-
{
-
status = "Salvo com Sucesso! Ultima ID: "+Cargo(event.result).idCargo;
-
getList();
-
}
-
-
public function remove():void
-
{
-
if (dgCargo.selectedItem != null) {
-
cargo = dgCargo.selectedItem as Cargo;
-
cargoService.remove(cargo);
-
} else {
-
Alert.show("Selecione um Item na DataGrid");
-
}
-
}
-
-
//Função que será executada após a conclusão do método remove
-
public function onResultRemove(event:ResultEvent):void
-
{
-
status = "Excluido com Sucesso!";
-
getList();
-
}
-
-
public function getList():void
-
{
-
cargoService.getList();
-
}
-
-
//Função que será executada após a conclusão do método getList
-
public function onResultGetList(event:ResultEvent):void
-
{
-
listCargos = event.result as ArrayCollection;
-
}
-
-
public function setDefault():void
-
{
-
txtIdCargo.text = "";
-
txtDsCargo.text = "";
-
}
-
-
//Ocorreu uma falha ao chamar algum servico servico.
-
public function onFault(event:FaultEvent):void
-
{
-
Alert.show(event.fault.message);
-
}
-
]]>
-
</mx:Script>
-
</mx:TitleWindow>
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/
aeeee
muito bom
parabens =]
nervoso esse tuto hein !
[...] Parte 1 Parte 2 [...]
28 de janeiro de 2008
Valeu Rodrigo, muito bom este seu tuto.
Parabéns Rodrigo@
A única diferença é q eu uso o Hibernate Annotations q implementa a JPA, assim elimino os arquivos hbm.xml e mapeio minhas entidades usando as anotações da jpa.
Em compensação, eu não uso as annotations do spring (por enquanto).
Abraços e boa sorte.
Jr.
28 de janeiro de 2008
Olá Mário,
Como disse, eu prefiro delegar a função “Mapeamento” a arquivos xml’s, do que acoplar annotations em meus beans de negócio.
Acho bacana usar annotations no hibernate, se eu usar o modelo de objetos anêmicos usando VO’s, BO’s e afins.. pois daí mapearia meu VO.
Neste artigo trago princípios do Domain Driven Desing escrito por Martin Fowler, uso o padrão Entity, então pessoalmente não acho legal mapear usando annotations.
Mas… é uma questão pessoal! do jeito que estar é tranquilo usar annotations tbm.
Abraços!
\o/
Tá bom! eu confesSo que eu tenteii ler até o fim!!…;)! pra ver se eu aprimorava os meus conhecimentos!!Maaas axeii meLHor ler a introduçãO e a última linha!Não comentareii sobre ela porque talvez não haja espaço suficiente pra tanto conhecimento!! Mas da última LINha!..HUm!! esSa é simples e eficaz!! “Pode muito em seus efeitos” ;*
Amo vocÊ meu amOr!! ?
29 de janeiro de 2008
Rodrigo, parabéns pelo seu artigo, achei muito legal, me ajudou bastante, você demonstra ter um bom conhecimento no assunto. Vou tentar usar BlazeDS em uma aplicação comercial que eu estou fazendo. Acredito que o uso de flex com java seja melhor em um estrutura hibrida. Onde eu poderia usar flex para gerar gráficos, listar itens ou mostra imagens de produtos usando algum tipo de animação. Fazer telas de cadastros/alteração e exclusão eu ainda acho melhor usar o bom e nem tão velho struts 2 integrado com dwr. Apesar de todo o problema de compatibilidade o uso de HTML/css/javascript torna a aplicação mais leve em relação ao flash.
Não sei se você já deu uma olhada em JavaFX … Mas senão posso dizer q seu código é escrito em uma estrutura declarativa, que torna sua implementação muito simples. Ela ainda é uma tecnologia que ainda está em um estagio beta,não da para usar comercialmente ainda. Mas que no futuro ela pode ser uma boa opção para a construção de aplicações RIA para os desenvolvedores Java.
Espero que você escreva mais artigos sobre flex. Parabéns!
29 de janeiro de 2008
Olá Fernando
“Fazer telas de cadastros/alteração e exclusão eu ainda acho melhor usar o bom e nem tão velho struts 2 integrado com dwr.”
Então, ultimamente tenho tido muito sucesso com o Flex em sistemas, seja ele fazendo tais telas e ainda gerando gráficos e etc…
Só não uso flex, quando a máquina cliente é muito ruim mesmo, coisa q até um ajax da vida causa memory leak.
Querendo ou não o Flex é uma aplicação WEB, só que com poder desktop.
Desenvolver com html, é custoso! até hoje não achei um modo de desenvolvimento tão rápido do que o Flex, coisas como IDE, Visual Editor, Componentização, É Orientado a Objetos, e etc.. Ajudam e muito no desenvolvimento.
JavaFX não olhei não, mas acredito que hoje o Flex atende e atende muito bem, afinal tem muitos anos de experiência no mercado. Tomara que esse JavaFx não seja semelhante a um Swing da vida…
Por que afzz.. A sun para visual é complicado.
Abraços e obrigado pelo feed-back.
Parabéns pelo post está de excelente qualidade, um pouco extenso, mas não poderia ser de outra forma afim de cobrir todo o conteúdo. Abraço !!!
7 de fevereiro de 2008
Muito bom!
Com certeza muita gente ira iniciar flex/Java depois deste tutu.
Duvida rápida:Para aplicações comerciais o BlazeDS é pago?
Como funciona?
7 de fevereiro de 2008
Olá Ricardo,
não sei se leu, mas o BlazeDS está sobre a licença LGPL v3.
7 de fevereiro de 2008
Parabens pelo artigo, cobriu muito bem me ajudando bastante. Mas fiquei com tr~es duvidas, talvez vc poderia me adiantar:
Qual a função dos jar’s : flex-tomcat-common.jar e flex-tomcat-server.jar ?
Para que serve o mapeamento no web.xml da pasta hotfixes?
Qual o motivo de se criar uma factory spring, já que existe a do java por default?
Abraços
7 de fevereiro de 2008
Olá Bruno, obrigado pelo feedback.
Qual a função dos jar’s : flex-tomcat-common.jar e flex-tomcat-server.jar ?
Esses jars são usados para que o blaze possa fazer autenticacao no Tomcat, usandos roles e etc.
Para que serve o mapeamento no web.xml da pasta hotfixes?
A pasta flex dentro do web-inf, contem arquivos do sdk flex, logo se estiver usando o modulo para o Tomcat que provê uma compilação web-tier do MXML, ele usará os hotfixes que estiverem aí. No momento isto é dispensável, apenas segui a documentação.
Qual o motivo de se criar uma factory spring, já que existe a do java por default?
Você fala a própria factory do Spring?
digamos que o flex não tem como acessar ela, aí então usamos esta helper que faz um “lookup” nos beans do Spring, devolvendo para o Flex.
Abraços e boa sorte!
\o/
7 de fevereiro de 2008
Valeu Rodrigo!!!
14 de fevereiro de 2008
Rodrigo, há realmente a necessidade de criar o Cargo.as, não teria uma outra maneira de fazer sem usar esse mapeamento do nosso pojo em as?
14 de fevereiro de 2008
Não a necessidade, se você tirar, você teria que passar parametros via tipos primitivos, ou entao um array ou algo do tipo, mas realmente você quer fazer isto?
Só lembrando que o “custo” de fazer o mapeamento no flex, é extremamente compensado, por você trabalha com Objetos.
Exemplo disso, imagine uma datagrid populada com uma lista de Cargos, cada posição da lista, será um objeto do tipo Cargo, logo eu tenho um objeto tipado! por exemplo para pegar um cargo selecionado nesta grid eu faria assim:
var cargo:CargoVO = CargoVO(dgCargo.selectedItem);
assim como em qualquer outro componente, ou até mesmo na passagens de parâmetros via events e etc…
Abraços
\o/
17 de fevereiro de 2008
Rodrigo, in spite of my native language is spanish your article is very clear and give me a better understanding of these technologies. I was looking for an alternative to JSP, JSF, etc, to the view part on the MVC model and Flex is the answer. Thanks a lot.
17 de fevereiro de 2008
Hola José Castillo,
Gracias por su comentarios!
Me siento bien sabiendo que estoy llegando a mucho outros lugares.
\o/
18 de fevereiro de 2008
Valeu Rodrigo, mas vc acha que é necessário para seguir este tutu?
E estou seguindo a risca e quando mapeio os HB’s que no meu caso é :com/webservice/model/repository/hibernate/ da erro!
E quando eu removo ele deixando em branco ele funciona, por que?
18 de fevereiro de 2008
Olá Ricardo,
“Mas vc acha que é necessário para seguir este tutu?”
Concerteza! não faz sentido seguir com o tutorial nem sem saber o que um Hibernate ou um Spring tem por finalidade.
Leia a documentação apresentada aqui, que ficará fácil de resolver problemas posteriores.
Abraços!
\o/
25 de fevereiro de 2008
Execelnte tutorial, teria como disponibilizar o projeto para importar no Eclipse, assim como feito no final da parte 1 do tutorial?
25 de fevereiro de 2008
Acredito que você não tenha lido o tutorial inteiro…
No final…
Tópico no Forum que contém detalhes sobre o download. Flex 2.0 e Flex 3.0
[http://forum.flexbrasil.com.br/viewtopic.php?f=8&t=46#p139]
26 de fevereiro de 2008
É possível obter a saída do Hibernate com os unparameterized SQL?
Por padrão, o outuput SQL aparece como “insert into javaflex_cargo (DS_CARGO) values (?)”. Eu gostaria de ser capaz de ver o que ele está passando por valor no ?.
O Hibernate usa Prepared Statement internamente, de modo que não têm sempre o SQL em um formato onde valores seriam incorporados.
26 de fevereiro de 2008
E pensar que dá pra fazer tudo isso usando Flex e Rails com apenas 1/100 de código…
É preciso dar uma tonelada de links, livros, vários frameworks etc, pra fazer uma telinha simples de cadastro??
Ainda bem que eu parei com as drogas. ![]()
26 de fevereiro de 2008
Depende… se for para fazer um pequeno sistema….
Seu rails com 1/100 linhas tem injeção de dependência? ou você acopla seu código com new’s em tudo?
Provê objeto distribuído? do jeito que este exemplo está com 3 linhas de código eu posso disponibilizar um serviço para qualquer um usar.
Uma telinha simples de cadastro?
Claro, se for só para fazer tal telinha de cadastro eu acoplaria tudo em poucas classes.
A intenção aqui Eduardo, foi mostrar como você pode trabalhar com Flex e Java corporativamente, logo não será qualquer scaffold que atenderá as necessidades comum em um ambiente enterprise.
Livros? entendimento de frameworks e afins?
Tudo tem seu significado, e como uma pessoa de T.I. devo conhecer tecnologias para possíveis problemas.
27 de fevereiro de 2008
Rodrigo, segui como também li muito sobre todas as tecnologias utilizada e estive tentando fazer um sistema de autenticação até baseado no seu method findById mas não estou consiguindo, como posso fazer?
27 de fevereiro de 2008
Bom seria você abrir um tópico no fórum:
http://forum.flexbrasil.com.br/
e especificar seu problema.
Abraços!
\o/
28 de fevereiro de 2008
Rodrigo, em qual classe eu poderia colocar minhas regras de negócio? Ou como eu poderia repassar a classe Cargo (creio que é um Data Transfer Object/ Value Object) para uma outra classe responsável pelas regras de negócio antes de passar o Data Transfer Object (Cargo) para a camada DAO com o intuito de persistir na base de dados?
28 de fevereiro de 2008
Se você leu com atenção o artigo, em certos momentos falo que estou fazendo uso do DomainDrivenDesing, logo o Cargo ali não é um DTO tão pouco VO.
Ele é o Objeto em sí, este segue o padrão entity do DDD.
Logo, o que vai te responder claramente sua dúvida, será você estudando sobre o DDD e sua filosofia, que em poucas palavras não desacopla comportamentos de atributos como em um BusinessObject e um DataTransferObject, mas modela um Objeto integente onde contém seus próprios comportamentos e atributos.
Você pode usar o padrão que você conhece, a arquitetura não influencia no uso do Flex.
Abraços.
\o/
29 de fevereiro de 2008
Camarada, parabéns pelo trabalho.
4 de março de 2008
Parabéns. Excelente artigo.
Você poderia disponibilizar o código-fonte?
[]’s
Cláudio
Parabéns pelo artigo! Este projeto pode ser utilizado tranquilamente como template, afinal de contas, quem gosta de ficar configurando toneladas de XMLs?
Porém não posso dizer que esta template é aplicável p/ “projetos do mundo real”. A solucao proposta, baseada no modelo tradicional service + Dao (por entidade!!) + hibernate = Lazy load exception. Isso nao ocorre neste exemplo pq a classe Cargo é extremamente simples. O que fazer neste caso? Ignorar Lazy-load e utilizar Eager por default? Eu acho que não…
Hibernate Annotations é JPA, logo virou padrão. Todo mundo tá usando e já já hbm.xml vai virar poeira, descontinuado. Quem usa Spring com annotations sabe que é um caminho sem volta, assim como JPA!
Não tenho nada contra o Flex, só não dá pra integrá-lo de modo produtivo com Java em projetos de médio/grande porte. Pra quem usa Linux então, esqueça! Flex Builder é precário.
O dia que a integração Flex + Maven multi-module-project + ambiente CI estiver resolvido, aí sim teremos uma alternativa concreta contra JSF e GWT.
Abraço!
5 de março de 2008
Olá Rodrigo mais uma vez, estou fazendo parte parte do seu excelente artigo, mais surgiu uma dúvida e não sei se pode me ajudar,no ínicio do artigo vc instalou o eclipse 3.3 e quando tento instalar o SpringIDE não consigo instalr via update site,diz que precisa o eclipse 3.2, sabe me dizer se tem como instalar o springIDE com eclipse 3.3,vlw
5 de março de 2008
Olá Janderson, é veradade, ofialmente só pode usar no Eclipse 3.2, porém! Existe um workaround para fazer funcionar.
Quando der o erro no update site, verifique o jar que ele está reclamando, então pegue este jar de um Eclipse 3.2 e coloque no plugins do seu 3.3
Aí tu engana a instalação!
Abraços!
5 de março de 2008
rsrsr, essa eu gostei
vlw pela dica Dr. e muito obrigado
6 de março de 2008
Olá Eduardo Rocha,
Vlw pelo feedback amigo, é um prazer contribuir com a comunidade.
Quanto ao “tradicional service +Dao por entidade”
Faço uso de DAO’s por entities pois sou não gosto de criar DAO’s genéricos, prefiro criar um para cada mesmo, e também a proposta era mostrar com integrar, se sua arquitetura faz uso de DAO genéricos e afins, é uma opção sua.
“O que fazer neste caso? Ignorar Lazy-load e utilizar Eager por default? Eu acho que não…”
Não amigo, não mesmo, aplicar um OpenSessionView no Flex com o BlazeDS é tranquilo, basta adicionar um filter no web.xml e url-mapping no endereco que é levando do AMF.
Como estou usando Spring, posso usar os support que ele contém: org.springframework.orm.hibernate3.support.OpenSessionInViewFilter é interceptar os lazy loads.
Só não toquei no assunto pois ficaria ainda maior abordar lazy loading e afins… isso ficará para o próximo artigo.
“Hibernate Annotations é JPA, logo virou padrão. Todo mundo tá usando e já já hbm.xml vai virar poeira, descontinuado. Quem usa Spring com annotations sabe que é um caminho sem volta, assim como JPA!”
Concerteza JPA é bacana, só que por questoes de legalibilidade de código não acoplo códigos de persistencia ao meu Entity de negócio, uma vez que estou seguinte padrões do DomainDrivenDesign, não rola deletar a função de mapeamento ao Entity.
“Não tenho nada contra o Flex, só não dá pra integrá-lo de modo produtivo com Java em projetos de médio/grande porte.”
Ola amigo não sei qual a sua experiência co Flex, mas hoje estou usando Flex para aplicacões de grande porte e está atendendo muito bem, ainda mais quando se usa integrado ao padrão JCP de portles, no caso da BEA Weblogic.
Vantagens de programação toda Orientada a objetos e o protocolo AMF3, nem se compara com navegaçÃo de textos/xml e afins com outros frameworks.
“Pra quem usa Linux então, esqueça! Flex Builder é precário.”
Bom, o FlexxBuilder para linux ainda não tem o modo visual, mas o auto-complete está perfeito, e logo logo saíra a versão com o DesingView, mas para quem se mata programando tags html ou js e css, programar só com um auto-complete já mata a paú.
“O dia que a integração Flex + Maven multi-module-project + ambiente CI estiver resolvido, aí sim teremos uma alternativa concreta contra JSF e GWT.”
Não sei de algo do genêro, mas você me falando agora, vou pesquisar e ver se tem algo do genêro, quando a alternativa, posso dizer que já é uma boa alternativa, cada um com suas vantagens, o flex mesmo em um ambiente corporativo com recursos de datapush, ajuda e muito! coisa que aplicações onde o cliente é slave (simples browser) não é possível implementar. Como o Flex roda sobre uma VM e está é um pouco mais inteligente além de vantagens visuais, tem um bom suporte no back-end.
Abraços
\o/
7 de março de 2008
e ai mano ..blz ..
eu vi manera apresentaçao lah na facul hje kra .. muito bom ateh entao nao sabia nda de flex e tal … e tudo mais que vc’s colocaram lah .. valeo kra
té mais
7 de março de 2008
Eae Jacir!
=)
Blza kra pelo feed-back, um caminho bacana para começar seria aqui:
http://forum.flexbrasil.com.br/viewforum.php?f=2
Abraços e qualquer coisa de um toque kra!
7 de março de 2008
valeo kra pela ajuda ai …
muito boa sua ideia de divulgar isso na rede kra .. sucesso pra vc kra ..
10 de março de 2008
Caro Rodrigo,
Sobre a solução que vc apresentou p/ o problema do Lazy-load que eu relatei, ambos sabemos que é furada. Você sabe disso muito bem, basta ler o tópico abaixo, iniciado por você inclusive.
http://tech.groups.yahoo.com/group/flexcoders/message/98655
Essa é uma limitação tão grande que torna o uso do Flex em grandes projetos inviável. Eu senti isso na pele, e aparentemente outros também:
http://tech.groups.yahoo.com/group/flexcoders/message/98681
Ouvir dos próprios engenheiros da Adobe que, no momento não há solução oficial (somente alguns workarounds, termo gringo metido p/ a popular gambiarra) foi suficiente p/ eu aguardar o amadurecimento da plataforma:
http://tech.groups.yahoo.com/group/flexcoders/message/98733
Continuo mantendo minha posição de standby p/ o Flex. Tem tudo p/ dar certo agora open-source. Mas ainda não é.
Novamente congratulo-o pela iniciativa, mas acho que faltou um pouquinho de honestidade para com os leitores.
10 de março de 2008
Olá Eduardo,
O que apresentei a você na resposta anterior, é uma solução ao LazyInitializationException, o simples listener do Spring no messagebroker resolve este problema.
O problema acontece quando o Blaze faz a serialização dos objetos, ao fazer isso, o é ativado o lazy.
Para isso existe algumas soluções ou workarounds como preferir, o que o Jeff apresentou é válido, e estou usando.
Mass! o mais interessante, é que o BlazeDS é OpenSource, concerteza teremos algumas soluções não mais workaround, eu mesmo já extendi de RemotingService e JavaAdapter para prover uma solução temporária, mas já encontrei outras pessoas desenvolvendo:
http://www.infoaccelerator.net/index.cfm?event=showEntry&entryId=84B781EA-FF30-C9A3-ADAC3B7518DC8E93
Com o BlazeDS, acredito que o Lazy load é coisa de pouco tempo.
Mas só lembrando que a ultima versão do GraniteDS suporta o Lazy Loading:
http://www.graniteds.org/confluence/display/DOC/2.4.2.+Lazy+Initialization
Eu pensando no futuro, prefiro investir no BlazeDS, por ser da própia Adobe e etc..
Bom é uma opinião sua dizer que Flex não é uma alternativa para desenvolvimento, mas só vale lembrar também, que RemoteObject é o plus! a mais quanto as outras tecnologias, você poderia muito bem ter lazy load usando HttpServices, ou então WebServices.
è uma opinião sua, porém só acho que não pode ser tão radical, aonde eu trabalho Flex com WebServices tem atendido muito bem, e olha que não é qualquer siteminha.
Abraços amigo, e vamos aguardar outras soluções com o BlazeDS.
10 de março de 2008
Estive lendo, como sugerido, para tentar encontrar uma resposta a minha dúvida. Em minhas leituras descobri que as regras de negócio podem ser colocadas nas Entities. Fica aí o esclarecimento pois outras pessoas me perguntaram também.
Desde já agradeço pela atenção de todos. ![]()
11 de março de 2008
Rodrigo, estou cmo uma outra dúvida. Como posso fazer a navegação entre arquivos MXML? Por exemplo: eu gostaria de clicar num botão de cadastras usuário e ir para uma outra página (outro MXML) de cadastro. Usávamos o MVC Cairngorm, entretanto não queríamos mais usar um framework MVC por não achar mais necessário diante do exposto por ti neste tutorial. =)
12 de março de 2008
Olá R.B,
Primeiramente, bacana que você abstraiu o Entity do DDD, a abordagem é muito bacana, você programa orientado a objetos, do tipo:
carro.AbrePorta();
financeiro.calcularDespesas();
…
Quanto a navegação,
Navegação com Flex basicamente se resume em 3:
States, ViewStack e PopUp’s.
Estas são as keywords para sua pesquisa, lembrando que a boa prática aí é o uso de ViewStacks.
States é muito bacana, porém procure usar para pequenas funcionalidades.
PopUp’s, é também bacana, porém sugam um pouquinho mais de memória, existem frameworks muito bons para o esquema MDI, um deles é o Flex MDI, eu mesmo usei em uma App que fiz a um bom tempo:
[GoogleWebDesktop]
http://www.flexdev.com.br/gwd/
Quanto ao MVC, acredito que você não entendeu muito bem quando disse que não precisava de um Framework MVC. Eu disse isso me referindo ao Struts, WebWork, SpringMVC e afins que existem no mundo java.
Com flex, é necessário arquitetar!, uma vez que ele é orientado a objetos, o desenvolvimento n camadas para reuso e componentização é necessário.
Logo, se sua aplicação passa a ter mais de 2 telas, bacana seria usar não um framework, mais eu diria um padrão de arquitetura, seja lá o Cairngorm, ou então o PureMVC, estes ajudam você resolver problemas conhecidos.
Abraços
13 de março de 2008
Rodrigo estive lendo sobre o Cairngorm e o PureMVC. Caso eu utilizasse o PureMVC com implementação no próprio AS3 eu conseguiria ainda assim fazer a integração com o Java + BlazeDS + Hibernate + SpringFrameWork como mostrado neste tutorial? Desculpe se parecer uma pergunta tola mas estou realmente precisando fazer um controle entre várias páguinas (como o cadastro de usuário) e decidi usar o PureMVC, estou lendo sobre ele e me surgiu esta dúvida enquanto estou estudando sobre esta nova ferramenta já que ela menciona que podem ser objetos remotos ou locais.
[...] Integrando Adobe Flex + BlazeDS + SpringFramework + Hibernate. [Parte1] [Parte2] Por que ele é relevante: Mostro com detalhes como integrar frameworks de mercado mais famosos no [...]
18 de março de 2008
Rodrigo, uma dúvida:
Quando eu coloquei o SpringFactory.java no pacote controller, e modifiquei o nome do pacote que estava no arquivo (de package flex.samples.factories para meupacote.controller) ele começou a dar um aviso de erro nas linhas:
import flex.messaging.FactoryInstance;
import flex.messaging.FlexFactory;
import flex.messaging.config.ConfigMap;
import flex.messaging.services.ServiceException;
como é que eu resolvo isso?
19 de março de 2008
Provavelmente você não adicionou os jars: flex-messaging-*.jar no seu classpath.
Abraços
3 de abril de 2008
Ótimo Artigo,
Para eu criar testes unitários para meus services usando o JUnit, qual configuração eu uso ?
Lendo a documentação vi que meu teste deve extender a classe AbstractTransactionalDataSourceSpringContextTests e escrever os testes que o Spring injetará todas as dependencias que eu preciso.
Isso acontece, porem eu consigo recuperar a lista de dados, mas não consigo adicionar. Consegue me dar uma luz do que fazer?
Att.
3 de abril de 2008
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
for (NivelUsuario nivelUsuario : list)
{
System.out.println(” ID: ” + nivelUsuario.getIdNivelUsuario() + ” -> ”
+ nivelUsuario.getDsNivelUsuario());
}
}
}
14 de abril de 2008
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.
14 de abril de 2008
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.
11 de maio de 2008
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 …
12 de maio de 2008
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 !! ![]()
12 de maio de 2008
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,
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 !
19 de maio de 2008
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.
17 de setembro de 2008
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.
17 de setembro de 2008
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
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?
6 de outubro de 2008
Parabéns pelo excelente artigo! Com certeza é um dos melhores artigos na internet falando sobre essa arquitetura.
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
[...] Integrando Adobe Flex + BlazeDS + SpringFramework + Hibernate - Uma Solução OpenSource para Sistem… [...]
12 de novembro de 2008
Cara esse plugin flex pro eclipse, é o adobe flex builder 3, se não, como faço pra instalar esse plugin no eclipse?
12 de novembro de 2008
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
4 de dezembro de 2008
hello,
if i have a class java with a composite key, how his calss ActionScript?
7 de janeiro de 2009
Rodrigo, boa noite.
Está dando esse erro, o que será que está errado, vc pode me ajudar?
Abraços!
7 de janeiro de 2009
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
10 de janeiro de 2009
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 Settings\Wesley\My Documents\Flex Builder 3\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\JavaFlex\WEB-INF\lib\servlet-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!
15 de janeiro de 2009
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?
Verifique se você está passando o arquivo service-config.xml no compiler do Flex
Properties->Flex Compiler-> Adicione:
-services “caminho/do/seu/services-config.xml”
15 de janeiro de 2009
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!
2 de fevereiro de 2009
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
4 de fevereiro de 2009
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
4 de fevereiro de 2009
Ola Rodrigo
O problema acima já esta resolvido, a senha para acessar o banco estava errada
Valeu
4 de fevereiro de 2009
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
Bom dia
Gostaria de compartilhar um problema que eu passei: Durante a execução da aplicação o TomCat não iniciava, problema que no meu caso se resolveu atualizando as bibliotecas do jakarta-commons, acessível em http://commons.apache.org/downloads/index.html
Abraços;
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;
9 de março de 2009
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
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.
5 de maio de 2009
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”
21 de maio de 2009
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
21 de maio de 2009
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
–>
11 de junho de 2009
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.
12 de junho de 2009
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…
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 Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Common Files\Ahead\Lib\
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.
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.
Comments RSS TrackBack Identifier URI
Deixe um comentário










89 Comentários