Adobe flex - tire suas dúvidas

[quote=rafaelk][quote]
Diferença entre tiers e layers: Layers devem rodar na mesma VM e podem se comunicar por referência de objetos. Tiers são em ambientes diferentes fisicamente falando, e não usam a mesma VM. E nem haveria como usar arquitetura de layers entre Flex/Java, é sempre TIER.

Uma aplicação Flex/Java é dividida em Tiers. Por vários motivos o que se usa quando falamos tiers (note a diferença entre tiers e layers) é SEMPRE DTO!

A comunicação deve ser feita com DTOs. Nunca com objetos persistentes.
[/quote]

Ok, se entendi, vc sujere o seguinte:
Vamos usar uma classe Pessoa como exemplo. Então terei a classe Pessoa.as que é idêntica a PessoaDTO.java e ainda terei a Pessoa.java (esta persistente) ?
Se for assim, não vejo necessidade de utilizar “lazy loading”, pois aí no meu DTO coloco tudo o que é realmente necessário para a camada de visão.

Att
Rafaelk[/quote]

Justo. Você deve ter no Flex, na verdade, PessoaVO.as, que é idêntico e mapeado como PessoaDTO.java.

Você está errado, Lazy-load não é apenas para diminuir o tráfego de objetos entre os tiers, mas também e tão importante quanto - não fazer consultas desnecessárias. Se você não usar Lazy-load seu banco vai afundar, é uma tática suicida. Vai por mim.

Prezados,
Tenho a seguinte duvida,
Vamos suporte que comprei o flex builder 3.0,
Acredito que o flex builber 3.0 é uma IDE apenas para flex, correto? Onde vou programar o java?
para programação/interação flex + java oque mais preciso?

Como vou começar agora com flex, tenho algumas duvidas e com certeza algumas são ridiculas.
Obrigado a todos,

Esse Tutorial ensina como integrar o flex e o java

http://blog.javacode.com.br/?p=22

Ola pessoal
Bem eu trabalhava com Java a um tempo, e a 3 meses comecei um projeto com Flex, nesse tempo aprendi flex, e comecei uma aplicação usando flex, java, blazeds e hibernate porem a mesma esta apresentando alguns erros agora.

O maior problema e o consumo excessivo de memoria no tomcat, passa de 100 megas direto e fica dando Java Heap Space :frowning:

Pelo que vi o problema esta no hibernate e blazeds, fiz cada classe com um EntityManagerFactory proprio, que é criado quando o Blaze-DS instancia a classse, o scope das classes está como application no blazeDs, Qnd inicio o Servidor ele cria varios EntityMangerFactorys (um pra cada Controller), e deixa la carregado na memoria, eu tentei usar uma classe de PersistenceUtil, para deixar o EntityManagerFactory como um Singleton, mais o BlazeDs sempre que uma nova classe chama o PersistenceUtil ele vai la e cria um EntitymanagerFactory de novo. Ou seja recria o EMF :frowning:

Como Posso contornar isso, mudar o scope dos RemoteObjects?? mudar Minhas classes do Hibernate? criar uma Factory??? Por favor me da a melhor solucao para este Problema.

O outro problema que tenho e quando fica muito tempo sem fazer um chamado no servidor e a Conexão Cai, tipo depois da noite toda, de manha sempre da um erro quando tento conectar novamente.
O erro é este
[codeorg.hibernate.util.JDBCExceptionReporter: The last packet successfully received from the server was 56697 seconds ago. The last packet sent successfully to the server was 56697 seconds ago, which is longer than the server configured value of ?wait_timeout?. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property ?autoReconnect=true? to avoid this problem. [/code]

Estou usando Mysql, como vc resolveu este problema?

Você está usando o pool de conexões ?

Nenhum Especifico.

Ok, vamos partir do mais simples.

Que padrão você está usando para a persistência? Como está funcionando? Como você está deployando as libs?

[]'s

[quote=AUser]Ok, vamos partir do mais simples.

Que padrão você está usando para a persistência? Como está funcionando? Como você está deployando as libs?

[]'s[/quote]

Bem, vou colocar os arquivos aki.

Meu Persistence.xml

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="ticket-s">
    <properties>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
      <property name="hibernate.connection.url" value="jdbc:mysql://apache/ticket-s" />
      <property name="hibernate.connection.username" value="admin" />
      <property name="hibernate.connection.password" value="123123" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
      <property name="hibernate.connection.pool_size" value="6" />
      <property name="hibernate.connection.autoReconnect" value="true" />
      <property name="hibernate.generate_statistics" value="false" />
      <property name="hibernate.show_sql" value="true" />
      <property name="hibernate.use_sql_comments" value="false" />
      <property name="hibernate.hbm2ddl.auto" value="update" />
      </properties>
  </persistence-unit>
</persistence>

O remoting-config

<?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="my-amf"/> </default-channels> <destination id="parametroService"> <properties> <source>com.equipes.sticket.controller.ParametroJpaController</source> <scope>session</scope> </properties> </destination> <destination id="clienteService"> <properties> <source>com.equipes.sticket.controller.ClienteJpaController</source> <scope>session</scope> </properties> </destination> </service>

Services-config

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
	<services>
		<service-include file-path="remoting-config.xml"/>
	</services>
	<security>
		<login-command class="flex.messaging.security.TomcatLoginCommand" server="Tomcat"/>
	</security>
	<channels>
		<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
			<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
		</channel-definition>
		<channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
			<endpoint url="https://{server.name}:{server.port}/{context.root}messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
			<properties>
				<add-no-cache-headers>false</add-no-cache-headers>
			</properties>
		</channel-definition>
		<channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
			<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/>

		</channel-definition>
	</channels>
	<logging>
		<target class="flex.messaging.log.ConsoleTarget" level="Error">
			<properties>
				<prefix>[BlazeDS]</prefix>
				<includeDate>false</includeDate>
				<includeTime>false</includeTime>
				<includeLevel>false</includeLevel>
				<includeCategory>false</includeCategory>
			</properties>
			<filters>
				<pattern>Endpoint.*</pattern>
				<pattern>Service.*</pattern>
				<pattern>Configuration</pattern>
			</filters>
		</target>
	</logging>
	<system>
		<redeploy>
			<enabled>false</enabled>
		</redeploy>
	</system>
</services-config>

Minha Classe ParametroJPAController mapeada no Remote-config

[code]
public class ParametroJpaController {

private static Logger logger = Logger.getLogger(ParametroJpaController.class);

public ParametroJpaController() {
	logger.debug("** Criou a instancia Parametro e o EMF");
    emf = Persistence.createEntityManagerFactory("ticket-s");
}
private EntityManagerFactory emf = null;

public EntityManager getEntityManager() {
	logger.debug("** Criou Entity manager de Parametro");
    return emf.createEntityManager();
}

public void create(Parametro parametro) {
	if(parametro.getIdParametro() == null || parametro.getIdParametro() == 0){
		parametro.setIdParametro(null);
	}
	
    EntityManager em = null;
    try {
        em = getEntityManager();
        em.getTransaction().begin();
        em.merge(parametro);
        em.getTransaction().commit();
    } finally {
        if (em != null) {
            em.close();
        }
    }
}

public void edit(Parametro parametro) throws NonexistentEntityException, Exception {
    EntityManager em = null;
    try {
        em = getEntityManager();
        em.getTransaction().begin();
        parametro = em.merge(parametro);
        em.getTransaction().commit();
    } catch (Exception ex) {
        String msg = ex.getLocalizedMessage();
        if (msg == null || msg.length() == 0) {
            Integer id = parametro.getIdParametro();
            if (findParametro(id) == null) {
                throw new NonexistentEntityException("The parametro with id " + id + " no longer exists.");
            }
        }
        throw ex;
    } finally {
        if (em != null) {
            em.close();
        }
    }
}

public void destroy(Integer id) throws NonexistentEntityException {
    EntityManager em = null;
    try {
        em = getEntityManager();
        em.getTransaction().begin();
        Parametro parametro;
        try {
            parametro = em.getReference(Parametro.class, id);
            parametro.getIdParametro();
        } catch (EntityNotFoundException enfe) {
            throw new NonexistentEntityException("The parametro with id " + id + " no longer exists.", enfe);
        }
        em.remove(parametro);
        em.getTransaction().commit();
    } finally {
        if (em != null) {
            em.close();
        }
    }
}

public List<Parametro> findParametroEntities() {
    return findParametroEntities(true, -1, -1);
}

public List<Parametro> findParametroEntities(int maxResults, int firstResult) {
    return findParametroEntities(false, maxResults, firstResult);
}

private List<Parametro> findParametroEntities(boolean all, int maxResults, int firstResult) {
    EntityManager em = getEntityManager();
    try {
        Query q = em.createQuery("select object(o) from Parametro as o");
        if (!all) {
            q.setMaxResults(maxResults);
            q.setFirstResult(firstResult);
        }
        return q.getResultList();
    } finally {
        em.close();
    }
}

public Parametro findParametro(Integer id) {
    EntityManager em = getEntityManager();
    try {
        return em.find(Parametro.class, id);
    } finally {
        em.close();
    }
}

public int getParametroCount() {
    EntityManager em = getEntityManager();
    try {
        return ((Long) em.createQuery("select count(o) from Parametro as o").getSingleResult()).intValue();
    } finally {
        em.close();
    }
}

}[/code]

Meu remote Object em MXML

[code]<mx:RemoteObject id="saveService" destination="parametroService" result="handleSaveResult(event)"
				 fault="handleFault(event)" showBusyCursor="true"/>[/code]

Bem Basicamente é isso repetido n vezes com varias classes e varios RemoteObjects

Aproveitando o mesmo tópico, qual a melhor maneira de se fazer “binding” usando flex e dto? é melhor usar algum framework ou flex tem um suporte nativo que já “dá conta” ?
algo tipo [Bindable] e no form <text value="{pessoa.nome}", deste jeito já resolve tando do dto para o form como do form para o dto ?

[quote=rafaelk]Aproveitando o mesmo tópico, qual a melhor maneira de se fazer “binding” usando flex e dto? é melhor usar algum framework ou flex tem um suporte nativo que já “dá conta” ?
algo tipo [Bindable] e no form <text value="{pessoa.nome}", deste jeito já resolve tando do dto para o form como do form para o dto ?[/quote]

Sim, resolve.

Olá amigo, acho que não estou entendendo o seguiente:
Imagine que eu declare uma variável do tipo pessoa
private var pessoa:Pessoa = new Pessoa();// ou recebendo de um remote object.
Ok, o problema é que no meu form eu tenho algo do gênero:
<mx:TextInput text="{pessoa.nome}"/>
Pois bem, quando eu chamo uma função, por exemplo “salvar” através de um botão, por mais que eu preencha o form, os atributos do objeto pessoa estão nulos. Não sei se estou fazendo algo errado, ou se teria que usar <mx:object > que vi em alguns exemplos… qual é a melhor forma ?

Obrigado
Kloss

O Binding no Flex é unidirecional. No Flex 4 vc já pode fazer ele bidirecional colocando um @ não me lembro onde, só ler a documentação. Caso esteja no Flex 3, vc teria basicamente duas opções:
Usar o creationComplete do componente desejado para fazer o binding view-> dominio usando o BindingUtils (Não use o Binding via XML, já via vários paus pra quem usa que não vou comentar aqui por brevidade).
A outra opção é vc no evento clique de seu botão salvar popular todo seu objeto na mão.
Em relação a essa última, na minha empresa eu e um amigo fizemos um framework para preencher campos de formulários automaticamente usando a convençao nome do atributo id do componente. Ficou bem legal, parecido com o SwingBean, com os métodos populateView(domínio) e getDomainObject().

  1. Você tem uma no Flex espelhando a sua entidade do Java?
  2. Você carrega o objeto depois de salvar? (uma maneira seria ao salvar no seu dao o return do método ser o tipo do objeto, e no resultSave você preenche seu objeto com o novo)

Hum, eu tinha entendido que o objeto nulo era no próprio Flex, vamos esperar ele se pronunciar…

Há algum tempo houve a pergunta se havia alguma empresa trabalhando com Flex com mais de 10 pessoas. Bem, minha empresa, a P2D, está trabalhando com 15 pessoas em um sistema Air (versão desktop do Flex) para a área de saúde.

[]s

Sim, ele falou que era no Flex… eu que não fiz a pergunta da maneira correta :S
Se o problema é no Flex logicamente ele tem uma espelhando :smiley:

O intuito da pergunta era porque se você no java tiver a variavel com o nome pessoa e no Flex pes, logicamente não vai achar porque são nomes diferentes, assim como a questão de maiusculas e minuscula os nomes devem ser estritamente iguais. (acho que é isso, porque isso confunde as vezes, mas é uma das possibilidades de estar vindo nulo)

Sim, ele falou que era no Flex… eu que não fiz a pergunta da maneira correta :S
Se o problema é no Flex logicamente ele tem uma espelhando :smiley:

O intuito da pergunta era porque se você no java tiver a variavel com o nome pessoa e no Flex pes, logicamente não vai achar porque são nomes diferentes, assim como a questão de maiusculas e minuscula os nomes devem ser estritamente iguais. (acho que é isso, porque isso confunde as vezes, mas é uma das possibilidades de estar vindo nulo)[/quote]

Como ele falou que o objeto ficava nulo mesmo após ele preencher o formulário, achei que ele estava apenas não conseguindo popular o objeto a partir da view.

Outra coisa tb que queria dar uma opinião, a 2 meses atrás fiz um curso de Flex Avançado na Eng em SP. Apesar de já ter visto muito coisa do que eles falaram (já estava trabalhando com Flex há 5 meses na empresa) achei bacana pra ver alguns detalhes, e com certeza seria um excelente curso para iniciantes.

Para mim, para quem programa em Java, os principais pontos a serem estudades com profundidade é o esquema de Eventos e Binding de Flex. Com relação ao primeiro, mesmo durante o curso, no qual o professor era muito bom, percebi que nem mesmo ele compreendeu direito o sistema de lançamento de eventos. Demorei um pouco para entender, depois de passar uns perrengues e usar gambiarras como Aplication.aplication para lançar e receber eventos.

[]s

Sim, o a referência do objeto actionscript que tem os valores nulos, e tenho um “espelho” para cada objeto java. Mas já estou entendendo que vou ter que “bindar” na mão os objetos neste caso ou então utilizar algum tipo de framework / componente como citado. Aliás , aproveitando alguém conhece algum open source ?

deixe eu ver se entendi: dá para criar, por exemplo, um sistema ecf ‘com a cara do air’, mas com o java ‘por trás’ (ui!) cuidando da comunicação com a impressora e persistindo os dados no bd? :roll:

Persistindo os dados no banco de dados com certeza! Tanto Java, Hibernate, Spring, … Fica igual a qualquer outra aplicação web que utilize Java.A comunicação com a impressora teoricamente acho que da (Porque voce pode fazer tudo no Java, e apenas enviar os parametros do Flex), agora não sei maiores detalhes, nem posso te garantir porque nunca fiz algo semelhante.