VRaptor - Popular Map<Enum, String> como parâmetro

3 respostas
Rafael_Guerreiro

Boa tarde.

Eu estou tentando fazer com que o VRaptor popule um Map<Enum, String> através de um formulário. (Tentei por ajax também, passando o mesmo name que o input, mas não consegui.)

&lt;form action="${linkTo[ReportController].getReport}" method="post"&gt;
   &lt;input name="search.map[NAME]" /&gt;
&lt;/form&gt;
public class Search {
   private Map&lt;SearchField, String&gt; map = new HashMap&lt;SearchField, String&gt;();
// getters e setters
}
public void getReport(Search search){
      // o search não está sendo populado. Está vindo com o valor normal.
   }

3 Respostas

Lucas_Cavalcanti

isso é uma issue antiga:

uma solução possível (e talvez mais OO):

troque o seu Map<SearchField, String> por uma List e crie a classe SearchCriteria com dois atributos, o field e o texto.

rafaelbtz

Lucas, pelo que eu entendi desse Post nem mesmo Map<String, String> pode ser usado como parâmetro?

eu estou criando um método com a seguinte assinatura:

public void lista(HashMap<String, String> filters) {
}

e quando tento acessá-lo recebo a seguinte exceção

br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=filters, type=class java.util.HashMap)
Caused by: java.lang.IllegalStateException: Paranamer were not able to find your parameter names for public java.util.HashMap(int)You must compile your code with debug information (javac -g) or register another name provider. Try to use br.com.caelum.vraptor.http.DefaultParameterNameProvider instead.
Lucas_Cavalcanti

exato… o VRaptor não consegue popular mapas, pq é meio complicado definir uma sintaxe boa pra popular os parâmetros. Um workaround (que melhora a orientação a objetos) seria criar uma classe:

public class Filter {
    private String name;
    private String value;
    //getters e setters
}

e receber uma List filters…

desse modo vc pode mover o código que aplicaria esses filtros para dentro da classe Filter, melhorando o código do controller.

Criado 6 de junho de 2012
Ultima resposta 22 de nov. de 2012
Respostas 3
Participantes 3