Amigos, bom dia !
Criei uma aplicação JAVA, JPA com Flex.
Esta ocorrendo o erro “An unknown exception occurred while creating an instance of type”
Estou utilizando BlazeDs.
O erro ocorre quando chamo a classe Fachada pelo remoteobject, exatamente no construtor desta classe, onde crio “clienteController = ClienteController.getInstancia()”. Quando removo esta linha funciona normal. Pelo que entendo o VO não permite mais de um construtor, mas eu tenho dois construtores em meu been java Cliente. Isso podeu causar algum problema ?
Eu criei um VO para a minha classe cliente. Ele ficou assim:
package Objetos
{
import flash.system.System;
[Bindable]
[RemoteClass(alias="com.swe.cliente.model.Cliente")]
public class Cliente
{
public var codigo:int;
public var nome:String;
public var dataCadastro:Date;
public function Cliente()
{
}
}
}
Minha classe java Cliente esta assim:
package com.swe.cliente.model;
import java.io.Serializable;
import com.swe.utils.DateUtil;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="clientes")
public class Cliente implements Serializable{
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column (name="codigo")
private long codigo;
@Column (name="nome")
private String nome;
@Column (name="dt_cadastro")
private Calendar dataCadastro;
public Cliente(){
}
public Cliente(String nome){
this.nome = nome;
this.dataCadastro = DateUtil.parseCalendar(System.currentTimeMillis());
}
public long getCodigo() {
return codigo;
}
public void setCodigo(long codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Calendar getDataCadastro() {
return dataCadastro;
}
@Embedded
public void setDataCadastro(Calendar dataCadastro) {
this.dataCadastro = dataCadastro;
}
@Override
public String toString(){
return "Código "+codigo+" Nome "+nome+" Data Cadastro "+DateUtil.parseString(getDataCadastro());
}
}
Minha classe ClienteController:
package com.swe.cliente.controller;
import java.util.List;
import com.swe.cliente.dao.ClienteDAO;
import com.swe.cliente.model.Cliente;
public class ClienteController {
private ClienteDAO clienteDAO;
private static ClienteController instancia;
private ClienteController(){
clienteDAO = ClienteDAO.getInstancia();
}
public static ClienteController getInstancia(){
if (instancia == null){
instancia = new ClienteController();
}
return instancia;
}
public void inserir(Cliente cliente){
clienteDAO.inserir(cliente);
}
public void atualizar(Cliente cliente){
clienteDAO.atualizar(cliente);
}
public void apagar(Cliente cliente){
clienteDAO.apagar(cliente);
}
public Cliente persquisaPorCodigo(long codigo){
return clienteDAO.persquisaPorCodigo(codigo);
}
public List<Cliente> listaTodos(){
return clienteDAO.listaTodos();
}
}
Minha classe ClienteDAO:
package com.swe.cliente.dao;
import java.sql.Date;
import java.util.List;
import java.util.Properties;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.apache.openjpa.util.ExceptionInfo;
import com.swe.cliente.model.Cliente;
import com.swe.utils.dao.DaoUtils;
public class ClienteDAO {
private static ClienteDAO instancia;
private Properties props;
private EntityManagerFactory factory;
public EntityManager entityManager = null;
private ClienteDAO(){
initialize();
}
public static ClienteDAO getInstancia(){
if (instancia == null){
instancia = new ClienteDAO();
}
return instancia;
}
private void initialize(){
if ( entityManager == null || !entityManager.isOpen()){
props = new Properties();
factory = Persistence.createEntityManagerFactory("openjpa");
entityManager = factory.createEntityManager();
}
}
public void inserir(Cliente cliente){
entityManager.getTransaction().begin();
entityManager.persist(cliente);
entityManager.getTransaction().commit();
}
public void atualizar(Cliente cliente){
entityManager.getTransaction().begin();
entityManager.merge(cliente);
entityManager.getTransaction().commit();
}
public void apagar(Cliente cliente){
entityManager.getTransaction().begin();
entityManager.remove(cliente);
entityManager.getTransaction().commit();
}
public Cliente persquisaPorCodigo(long codigo){
entityManager.getTransaction().begin();
Query query = entityManager.createQuery("select clientes from Cliente clientes where clientes.codigo = ?1");
query.setParameter(1, codigo);
List results = query.getResultList();
if (results.size() == 0){
System.out.println("Sem dados!");
}
((Cliente)results.get(0)).toString();
entityManager.getTransaction().commit();
return (Cliente)results.get(0);
}
public List<Cliente> listaTodos(){
entityManager.getTransaction().begin();
Query query = entityManager.createQuery("select clientes from Cliente clientes");
List results = query.getResultList();
entityManager.getTransaction().commit();
return results;
}
}
Meu 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="servico">
<properties>
<source>com.swe.fachada.Fachada</source>
</properties>
</destination>
</service>
O meu mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="listaTodos();">
<mx:RemoteObject id="roFachada"
destination="servico"
result="roResult(event)"
fault="roFault(event)"
showBusyCursor="true"
/>
<mx:Script>
<![CDATA[
import Objetos.Cliente;
import mx.collections.ArrayCollection;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
[Bindable]
private var cliente:Cliente;
[Bindable]
private var clientes:ArrayCollection = new ArrayCollection();
private function editar(strTipo:String):void{
botoesModoEdicao(true);
camposModoEdicao(true);
}
private function crudAction(strTipo:String):void{
botoesModoEdicao(false);
camposModoEdicao(false);
}
private function botoesModoEdicao(boolEdicao:Boolean):void{
if (boolEdicao){
btnNovo.enabled = false;
btnAlterar.enabled = false;
btnExcluir.enabled = false;
btnPesquisar.enabled = false;
btnRefresh.enabled = false;
btnSalvar.enabled = true;
btnCancelar.enabled = true;
}else{
btnNovo.enabled = true;
btnAlterar.enabled = true;
btnExcluir.enabled = true;
btnPesquisar.enabled = true;
btnRefresh.enabled = true;
btnSalvar.enabled = false;
btnCancelar.enabled = false;
}
}
private function camposModoEdicao(boolEdicao:Boolean):void{
if (boolEdicao){
inputNome.enabled = true;
inputDataCadastro.enabled = true;
}else{
inputNome.enabled = false;
inputDataCadastro.enabled = false;
}
}
private function btnExcluirClick():void{
Alert.yesLabel = "Sim";
Alert.noLabel = "Não";
Alert.show("Confirma Exclusão ?","Exclusão",1|2,this);
}
private function btnPesquisarClick():void{
inputNome.enabled = true;
botoesModoEdicao(true);
}
private function roResult(result:ResultEvent):void{
clientes = result.result as ArrayCollection;
cliente = clientes.getItemAt(1,1) as Cliente;
}
private function roFault(restult:FaultEvent):void{
Alert.show("Erro: " + restult.fault.faultCode + " \n "
+ "Detalhe: " + restult.fault.faultDetail + " \n "
+ "Mensagem: " + restult.fault.faultString, "Busca", Alert.OK, null, null, null, Alert.OK);
}
private function listaTodos():void{
roFachada.listaTodosCliente();
Alert.show("Foi", "Busca", Alert.OK, null, null, null, Alert.OK);
}
]]>
</mx:Script>
<mx:Form x="10" y="51" width="628" height="362" backgroundColor="#F3F1F1">
<mx:FormItem label="Código" >
<mx:TextInput id="inputCodigo" text="{cliente.codigo.valueOf()}" enabled="false"/>
</mx:FormItem>
<mx:FormItem label="Nome">
<mx:TextInput id="inputNome" text="{cliente.nome.valueOf()}" enabled="false"/>
</mx:FormItem>
<mx:FormItem label="Data de Cadastro" >
<mx:DateField formatString="DD/MM/YYYY" id="inputDataCadastro" text="{cliente.dataCadastro}" enabled="false" monthNames="['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro']"/>
</mx:FormItem>
</mx:Form>
<mx:ApplicationControlBar x="10" y="10" width="628">
<mx:Button label="Novo" id="btnNovo" click="{editar('novo');}"/>
<mx:Button label="Alterar" id="btnAlterar" click="{editar('alterar');}"/>
<mx:Button label="Excluir" id="btnExcluir" click="btnExcluirClick()"/>
<mx:HBox width="28">
</mx:HBox>
<mx:Button label="Ok" id="btnSalvar" enabled="false" click="crudAction('salvar')"/>
<mx:Button label="Cancela" id="btnCancelar" enabled="false" click="crudAction('cancelar')"/>
<mx:HBox width="28">
</mx:HBox>
<mx:Button label="Pesquisar" id="btnPesquisar" click="btnPesquisarClick()"/>
<mx:Button label="Refresh" id="btnRefresh" click="listaTodos()"/>
</mx:ApplicationControlBar>
</mx:Application>