Estou com problemas para fazer upload, no VRaptor 3, quando tenho um ou mais <select multiple… no mesmo form. Acredito que seja relacionado ao parâmetro enctype=“multipart/form-data”.
Fiz da forma que falou. O erro parou de ocorrer, mas o retorno esta
sendo sempre o último valor selecionado e não todos os valores
selecionados como deveria ser.
com o vraptor padrão não dá pra fazer isso… a gente usa o ognl pra popular os parâmetros e ele não suporta isso…
vc tem duas opções: ou usar javascript pra colocar os índices antes de mandar a requisição, ou criar um interceptor que tenta ajustar esses parâmetros…
o do interceptor funcionaria assim (mais ou menos):
@Intercepts
public class FixParamsInterceptor implements Interceptor {
public FixParamsInterceptor(MutableRequest request) {..guarda em um field }
accepts(...) { return true;}
intercepts(...) {
Enumerator<String> params = request.getParameterNames();
while(params.hasNext()) {
String param = params.next();
if (param.contains("[]") {
String[] values = request.getParameter(param);
for (int i = 0.....)
request.setParameter(param.replace("[]", "[" + i+ "]"), values[i]);
}
}
stack.next(method, instance);
}
}
e vc precisaria criar a classe:
@Component
@PrototypeScoped
public class CustomRequestExecution extends DefaultRequestExecution {
public CustomRequestExecution(InterceptorStack stack, ...) {
super(...);
stack.add(FixParameterInterceptor.class);
}
}
Lucas, sei que esse na verdade não é um problema do vraptor, já que é o select-multiple que envia os dados diferente dos outros objetos. Mas há um impacto que colocar esse fix no core do vraptor? Se o problema é apenas com o OGNL será que dá para fazer um fix nas classes que integram o OGNL ao vraptor?
Nas minhas aplicações que fazem o uso de select-multiple atualmente estou fazendo isso via request.getParameter.
Eu não sei se é possível, mas pra mim o ideal seria que se o name do select fosse assim: name=“fornecedor.grupos.id” ou algo parecido, ele já preencheria os ids dos grupos do fornecedor. Acho que é a solução mais elegante neste caso.