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

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: "teste@de.email.com" 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:

[code]@Post("/special/condition/")
public void save(SpecialCondition obj) {
System.out.println(obj);

	message.success("successfully-saved");
}[/code]

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:'teste@de.email.com', 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:

[code]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
}[/code]

[code]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
}[/code]
Ou seja, todos os parâmetros estão sendo populados menos a List<ChargeSegregation> segregations… Estou passando errado?

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,

não seria isso :

obj.segregations[0].charge.id

ao invés disso?

obj.segregations[0].charge

@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:

[code]@Convert(Charge.class)
public class ChargeConverter implements Converter<Charge> {

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;
}

}[/code]

Não parece ter nada de errado!

ele cai no Converter?

@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:

[code]@Post("/special/condition/")
public void save(SpecialCondition obj, List<ChargeSegregation> segregations) {
System.out.println(obj);
System.out.println(segregations);

	message.success("successfully-saved");
}[/code]

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…

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

vc tem o setter dessa lista?

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

:oops:
Faltando getter e setter…

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