Bom dia pessoal,
eu tenho a seguinte classe:
class Estado {
private Integer id;
private String nome;
private Boolean ativo;
//get's e set's
}
no meu jsp eu tenho um checkbox para o campo Ativo, porém quando o usuário não marca o checkbox, ele vem como null e não como false, eu dei uma pesquisada na web e aqui no fórum e sei que o comportamento padrão do vraptor é esse mesmo, até ai tranquilo, mas teria como modificar esse comportamento ou é algo acima do vraptor ?
[]'s
troca para boolean (tipo primitivo) assim o padrão dele é false.
então Rafael, realmente com o boolean (tipo primitivo) dá certo, e pelo que testei se eu definir o default para false também da certo. só que para mim seria melhor uma solução mais dinâmica do que alterar os Boolean para boolean, pois eu teria que rever umas 200 classes… rsss
por isso estava pensando em um converter ou algo assim…
Você pode dar uma arrumada no BooleanConverter do VRaptor:
/***
* Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package br.com.caelum.vraptor.converter;
import static com.google.common.base.Strings.isNullOrEmpty;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
/**
* VRaptor's Boolean converter.
*
* Supports boolean-like values. Converts to TRUE the following strings : true,
* 1, yes, y, on Converts to FALSE the following strings: false, 0, no, n, off
*
* @author Guilherme Silveira
*/
@Convert(Boolean.class)
@ApplicationScoped
public class BooleanConverter implements Converter<Boolean> {
private static final Set<String> IS_TRUE = new HashSet<String>(Arrays.asList("TRUE", "1", "YES", "Y", "ON"));
private static final Set<String> IS_FALSE = new HashSet<String>(Arrays.asList("FALSE", "0", "NO", "N", "OFF"));
public Boolean convert(String value, Class<? extends Boolean> type, ResourceBundle bundle) {
if (isNullOrEmpty(value)) {
return null; // AQUI, AO INVÉS DE NULL, RETORNE FALSE.
}
value = value.toUpperCase();
if (matches(IS_TRUE, value)) {
return true;
} else if (matches(IS_FALSE, value)) {
return false;
}
throw new ConversionError(MessageFormat.format(bundle.getString("is_not_a_valid_boolean"), value));
}
private boolean matches(Set<String> words, String value) {
return words.contains(value);
}
}
Então Rafael, o complicado ai é que ele nem chega a passar pelo BooleanConverter. Estou vendo que o jeito vai ser sair alterando as classes…
É quase certeza que ele está passando no outro converter já registrado.
Acho que para o VRaptor entender que você quer sobreescrever ele, vc tem q fazer um BooleanConverter que exteds BooleanConverter do VRaptor e anotá-lo com @Converts(Boolean.class).
Então, eu baixei os fontes do vraptor e coloquei no classpath do eclipse, tentei depurar o BooleanConverter dele, só passa por ele quando eu marco o checkbox, senão nem passa.
Estou começando a achar que só vem pro vraptor se o check estiver marcado.
Será que é por que não entra na requisição? Forçar essa requisição com JavaScript vai te dar mto trabalho? Acho que nem vale a pena.
quando você não marca o checkbox o valor nem chega a ir pra requisição…
um dos jeitos de resolver isso é via javascript…
se vc está usando o JQuery, dá pra registrar algo assim, globalmente na aplicação:
$('form').submit(function() {
var form = $(this);
form.find(':checkbox').not(':checked').each(function() {
form.append('<input type="hidden" value="false" name="' + this.name + '">');
});
);
algo assim deve funcionar.