Estou fazendo um projeto com VRaptor e me deparei com o seguinte problema. Nosso form, tem algumas variáveis do tipo array( String[]. Long[], etc ). Essas variáveis são usadas para manter carregados os valores em nossa combobox. Ou seja, postamos os valores e quando a tela volta a ser renderizada, comparamos os valores dentro do array com os valores da lista que preenche a combo.
Conseguimos fazer essa parte de boa, mas o problema é que aqui na empresa utilizamos o Sonar e ele acusa como um problema se utilizarmos a própria referência do objeto no form. Explicando melhor, na hora de darmos os gets e sets nas variáveis do tipo array no form, o Sonar nos mostra que temos que clonar os arrays para não haver risco de mudança nos valores do array original. O código fica assim:
private Long[] brandsSelected;
public Long[] getBrandsSelected() {
if ( brandsSelected != null ) {
return ( Long[] ) brandsSelected.clone();
}
else {
return null;
}
}
public void setBrandsSelected(Long[] brands) {
if ( brands != null ) {
this.brandsSelected = (Long[]) brands.clone();
}
else {
this.brandsSelected = null;
}
}
Quando fazemos isso, o VRaptor parece perder o bind entre o que está vindo da tela e o objeto form. Ao invés de setar todos os valores do array, ele passa a considerar apenas o último. Ou seja, se na tela marcarmos as checkbos de valor 1,3,5,9 o que geraria um array Long[ 1,3,5,9 ] ele considera apenas o último valor Long[9].
Alguém tem alguma idéia de por que isso possa estar acontecendo?