Erro com send Objecto(class) para o servidor

14 respostas
R

Boas, estou com um problema na comunicação cliente servidor.
Eu estou a fazer um pequeno teste de adicionar um user(nome, pass) numa bd mysql.
A estrutura é
Cliente está em AIR
Servidor JPA
Tomcat 6
Blazeds
Hibernate
Framework Mate

O problema é o seguinte:
Quando envio um user para o servidor, quando lá chega os valores estão a null, sendo assim adiciona a bd com os campos a null.
Penso que tenho tudo direitinho, mas esse problema está a dar cabo de mim…porque já vi o codigo todo de uma ponta a outra e não encontro problemas…

Alguma ideia
Desde já obrigado

14 Respostas

H

Você poderia escrever a classe User do java e as por favor?

[]s,

R

Class User

package com.users;

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

import javax.persistence.Table;
@Entity

@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)

@Table(name=Users)

public class user{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name= "userId", nullable = false)
private Long userId;

@Basic
@Column(name="Nome", nullable = true, unique = false)
private String Nome;

@Basic
@Column(name="Pass", nullable = true, unique = false)
private String Pass;

public user()
{
	super();
}

public Long getId()
{
	return userId;
}

public String getNome()
{
	return Nome;
}

public String getPass()
{
	return Pass;
}

public void setId(Long userId)
{
	this.userId = userId;
}

public void setNome(String Nome)
{
	this.Nome = Nome;
}

public void setPass(String Pass)
{
	this.Pass = Pass;
}

}

Obrigado

AUser

Agora coloque a parte do Flex. O pojo de User.

[]'s

R

Parte Flex…

package com.adobe.Vos
{

[Bindable]
[RemoteClass(alias="com.users.user")]
public class user
{
	public function user()
	{
	}
	public var Nome:String;
	public var Pass:String;

}

}

H

Como o AUser falou, faltou escrever a classe ActionScript…

[]s,

AUser

No RemoteClass o U de User está minúsculo.

R

mais do flex

View:

<?xml version="1.0" encoding="utf-8"?>

<mx:Panel xmlns:mx=“http://www.adobe.com/2006/mxml” xmlns:mate="http://mate.asfusion.com/"
xmlns:vos=“com.adobe.Vos.*” layout=“absolute” width=“376” height=“358”>

<vos:user id="user" Nome="{nome.text}" Pass="{pass.text}"/>

<mx:Script>
	<![CDATA[
		import mx.rpc.Fault;
		import com.adobe.Events.userEvent;
		import com.adobe.Vos.user;
		
		public function Adiciona():void
		{
			if(user.Nome == null || user.Pass == null)
			{
				resultado("nulos a saida");
			}
			else
			{
			var event:userEvent = new userEvent(userEvent.SAVE,true);
			event.users = user;
			resultado (event.users.Nome+", "+user.Pass);
			dispatchEvent(event);
			}
		}
		
		public function resultado(ev:String):void
		{				
			resul.text = ev;
		}
		
		public function falha(ec:Fault):void
		{
			resul.text = ec.faultDetail.toString();
			resul.text +=ec.faultCode.toString();
			resul.text +=ec.faultString;
			resul.text +=ec.getStackTrace();
		}
		
	]]>
</mx:Script>


<mx:Form width="328" height="294" x="13" y="10">
	<mx:FormItem label="Nome" required="true">
		<mx:TextInput id="nome" text="{user.Nome}"  y="50" x="110"/>
	</mx:FormItem>
	<mx:FormItem label="Pass" required="true">
		<mx:TextInput id="pass" text="{user.Pass}" y="106" x="110"/>
	</mx:FormItem>
	<mx:TextArea id="resul" x="0" y="166" width="282" height="164"/>
	<mx:Button label="Ok" click="Adiciona()"/>
</mx:Form>

</mx:Panel>

Events

package com.adobe.Events

{

import com.adobe.Vos.user;
import flash.events.Event;

public class userEvent extends Event
{
	public static const SAVE:String = "addUser";
	
	public var users:user;
	
	public function userEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
	{
		super(type, bubbles, cancelable);
	}
	
}

}

maps

<?xml version="1.0" encoding="utf-8"?>

<mx:Script>
	<![CDATA[
		
		import com.asfusion.mate.core.*;
		import com.adobe.Events.userEvent;
		import com.adobe.Views.userView;
		
	]]>
</mx:Script>

<EventHandlers type="{userEvent.SAVE}">

	<RemoteObjectInvoker instance="{servi.serv}" method="Adiciona" arguments="{event.users}" >
		<resultHandlers>
			<CallBack method="resultado" arguments="{resultObject}"/>
		</resultHandlers>
		<faultHandlers>
			<CallBack method="falha" arguments="{fault}"/>
		</faultHandlers>
	</RemoteObjectInvoker>
</EventHandlers>

<service:service id="servi"/>

services:

<?xml version="1.0" encoding="utf-8"?>

<mx:Object xmlns:mate=“http://mate.asfusion.com/” xmlns:mx=“http://www.adobe.com/2006/mxml”>
<mx:RemoteObject id=“serv” destination=“UserService” showBusyCursor=“true” source=“com.userService” />
</mx:Object>

R

Desculpa fazer confusão,mas a class é user em minusculo.
Dá para ver no código.
Mas mesmo assim fiz a alteração,e o servidor deixou de responder.

Obrigado…

AUser

No código tá “User” , não User.

E deve ter o mesmo nome.

[]'s

R

Não, os nomes estão direitinhos…
Eu se passar uma string do cliente para o servidor não tenho problema, agora se for um objecto(user) ai os parametros no servidor ficam a null.

Obrigado

AUser

Justamente. Os tipos String já estão mapeados. Agora caso você passe objetos que não estão mapeados, ele vai chegar Null. É normal e até certo isso.

O que estou te dizendo é que a classe USER no lado Java está como User, e o mapping está feito para “user”. Isso de acordo com o código que você postou.

R

Não,eu é que no inicio coloquei “class User”, mas não é com “U” pois pode ver que diz:

public class user{
e
public user

está tudo em minusculas

Obgd

H

Oi,

Não querendo ser chato mais já sendo :), usamos como padrão nome de Classe começando com maiúscula e propriedades como minúscula…

Só para esclarecer, o que chega no server null? Todas as propriedades? O que consegui ver é que a prop userId não está declarada na classe AS.

Outra coisa, declare no início da sua aplicação <mx:TraceTarget /> e da um debug. Pegue a chamada para o server e veja se o usuário esta sendo passado…

[]s,

AUser

A classe no AS deve ser um espelho do POJO java. Mas pra evitar sustos, coloque o atributo “dynamic” antes do class. assim sendo, coloque também “public dynamic class” ao invés de “public class”.

Criado 10 de dezembro de 2009
Ultima resposta 10 de dez. de 2009
Respostas 14
Participantes 3