[Resolvido] Popular alguns atributos em uma lista via ajax com VRaptor

8 respostas
Rafael_Guerreiro

Boa tarde.

Eu estou com um pequeno problema, eu faço uma requisição AJAX com o seguinte objeto como parametro:
{
obj.active: "Y"
obj.collector: "Rafael"
obj.consolidation: "3"
obj.customer: "111111111"
obj.daysFromBLIssue: "50"
obj.direction: "EXP"
obj.emails: "[email removido]"
obj.excel: "N"
obj.expiration: "1"
obj.id: ""
obj.locale: "0655"
obj.print: "Y"
obj.segregations[0].charge: "2234"
obj.segregations[0].group: 1
obj.segregations[1].charge: "123"
obj.segregations[1].group: 1
obj.segregations[2].charge: "566"
obj.segregations[2].group: 2}
Tenho a seguinte action:
@Post("/special/condition/")
	public void save(SpecialCondition obj) {
		System.out.println(obj);

		message.success("successfully-saved");
	}
Esse sysout gera a seguinte string (alterei o toString para mostrar os campos e os valores):
{
	id:null, 
	customer:{
		code:'111111111', 
		name:'SADIA', 
		cnpj:'123123123123123'}, 
	collector:'Rafael', 
	direction:'EXP', 
	locale:{
		code:'0655', 
		name:'ITAJAÍ'}, 
	emails:'[email removido]', 
	active:'Y', 
	consolidation:{
		id:3, 
		name:'VESSEL_CONSOLIDATION'}, 
	daysFromBLIssue:'50', 
	expiration:{
		id:1, 
		name:'NORMAL_EXPIRATION'}, 
	expirationComplement:'null', 
	segregations:null, 
	print:'Y', 
	excel:'N'
}
Como podem perceber a lista segregations está vindo nula... Seguem meus 2 modelos:
public class SpecialCondition implements DataTables, SetId {

	@Id
	@Column(name = "SPECIAL_CONDITION_ID")
	private Long id;

	@ManyToOne
	@JoinColumn(name = "sfc", columnDefinition = "char")
	private Customer customer;

	@Column(name = "COLLECTOR")
	private String collector;

	@Enumerated(EnumType.STRING)
	@Column(name = "direction", columnDefinition = "char")
	private Direction direction;

	@ManyToOne
	@JoinColumn(name = "locale_code", columnDefinition = "char")
	private Locale locale;

	@Column(name = "emails")
	private String emails;

	@Enumerated(EnumType.STRING)
	@Column(name = "active", columnDefinition = "char")
	private Flag active;

	@ManyToOne
	@JoinColumn(name = "consolidation_id")
	private Consolidation consolidation;

	@Column(name = "days_from_bl_issue")
	private int daysFromBLIssue;

	@ManyToOne
	@JoinColumn(name = "special_expiration_id")
	private SpecialExpiration expiration;

	@Column(name = "special_expiration_complement")
	private Integer expirationComplement;

	@OneToMany(mappedBy = "specialCondition")
	private List<ChargeSegregation> segregations;

	@Enumerated(EnumType.STRING)
	@Column(name = "print", columnDefinition = "char")
	private Flag print;

	@Enumerated(EnumType.STRING)
	@Column(name = "excel", columnDefinition = "char")
	private Flag excel;
// getters e setters
}
public class ChargeSegregation implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@ManyToOne
	@JoinColumn(name = "charge_id")
	private Charge charge;

	@Id
	@ManyToOne
	@JoinColumn(name = "special_condition_id")
	private SpecialCondition specialCondition;

	@Column(name = "charge_segregation_group")
	private int group;
// getters e setters
}
Ou seja, todos os parâmetros estão sendo populados menos a List<ChargeSegregation> segregations... Estou passando errado?

8 Respostas

danilomunoz

Opa,

Quando eu tenho esse tipo de problema, costumo montar o objeto no controller e devolver ele para ver o formato que o VRaptor gera.
Neste caso, eu faria:

@Post("/special/test/")  
public void test() {  
    SpecialCondition sc = new SpecialCondition();
    //Preenche o model
    result.use(Results.json()).from(sc).recursive().serialize();
}

Até mais,

kadu.m.lino

não seria isso :

obj.segregations[0].charge.id

ao invés disso?

obj.segregations[0].charge
Rafael_Guerreiro

@danilomunoz
Não entendi o que você quis dizer... O meu problema está no envio dos parâmetros para a action e não o contrário...

@kadu.m.lino Não... É .charge mesmo, visto que eu tenho um converter para Charge que recebe o ID como parâmetro:
@Convert(Charge.class)
public class ChargeConverter implements Converter&lt;Charge&gt; {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	private ChargeDAO dao;

	public ChargeConverter(ChargeDAO dao) {
		this.dao = dao;
	}

	@Override
	public Charge convert(String value,
			Class&lt;? extends Charge&gt; type, ResourceBundle bundle) {
		try {
			return this.dao.get(Long.parseLong(value));
		} catch (NumberFormatException e) {
			logger.warn(&quot;Unable to convert to long. Value: '&quot; + value + &quot;'\n&quot;
					+ e.getMessage());
		} catch (HibernateException e) {
			logger.warn(&quot;Unable to get this record. Value: '&quot; + value + &quot;'\n&quot;
					+ e.getMessage());
		} catch (Exception e) {
			logger.warn(&quot;An error occured. Value: '&quot; + value + &quot;'\n&quot;
					+ e.getMessage());
		}
		return null;
	}
}
kadu.m.lino

Não parece ter nada de errado!

ele cai no Converter?

Rafael_Guerreiro

@kadu.m.lino
Você tem razão, eu havia me esquecido de verificar isso, então fui verificar e não estão passando.

Eu fui um pouco mais além e fiz outro teste: Adicionei mais um parâmetro na minha action:
@Post("/special/condition/")
	public void save(SpecialCondition obj, List&lt;ChargeSegregation&gt; segregations) {
		System.out.println(obj);
		System.out.println(segregations);

		message.success("successfully-saved");
	}
Retirei os "obj." na frente dos segregations na requisição, resultado:
[{
charge:{
   id:566, 
   name:'CAPATAZIA'}, 
specialCondition:'null', 
group:'1'}, {
charge:{
   id:2234, 
   name:'DOC FEE'}, 
specialCondition:'null', 
group:'1'}, {
charge:{
   id:123, 
   name:'FREIGHT'}, 
specialCondition:'null', 
group:'2'}]
Ou seja, está "certo" o VRaptor não está conseguindo popular essa mesma lista quando ela está dentro da entidade...
kadu.m.lino

Não sei o que pode ser!

vê se ele cai no StringConverter do vraptor! talvez ele não esteja considerando o charge como objeto do tipo Charge

se vc não encontrar o problema eu sugiro q vc passe charge.id
pra receber soh o SpecialCondition no parâmetro!

flws

Lucas_Cavalcanti

vc tem o setter dessa lista?

se vc abre o firebug ou o developer tools do browser, aparecem todos os parametros da requisição?

Rafael_Guerreiro

:oops:
Faltando getter e setter…

=/ total falta de atenção… Valeu Lucas!

Criado 15 de fevereiro de 2013
Ultima resposta 16 de fev. de 2013
Respostas 8
Participantes 4