[Resolvido] [vraptor] Formatar Dados Antes da Associação

Olá pessoal…

Estou com um problema usando vraptor.
Estou iniciando, até agora só CRUD básicos, mas estou gostando bastante do vraptor.

Então, meu problema é o seguinte, tenho um campo do tipo BigDecimal na classe model.
O valor deste campo na view é formatado por javascript, facilitando a visualização do valor pelo usuário.
Mas ao enviar os dados o vraptor associa os campos automaticamente, então o valor 10.000,00 deveria ser convertido para 10000.00, correto?
Como posso interceptar o valor desse campo, formatar no tipo aceito por uma variável do tipo Decimal e setar manualmente o valor do Objeto?

Será que compliquei? rsrs

Desde já agradeço!

Você pode criar um converter para BigDecimal e quando você for fazer a conversão, você faz um replace dos caracteres:

Algo assim:

@ApplicationScoped
@Convert(BigDecimal.class)
public class BigDecimalConverter implements Converter<BigDecimal> {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	@Override
	public BigDecimal convert(String value, Class<? extends BigDecimal> type,
			ResourceBundle bundle) {
		try {
			return new BigDecimal(value.replace(".", "").replace(",", "."));
		} catch (NumberFormatException e) {
			logger.warn("Unable to convert to BigDecimal. Value: '" + value + "'\n"
					+ e.getMessage());
		}
		return null;
	}
}

Rafael, obrigado pela ajuda.

Mas o problema é que ao enviar o formulário, o vraptor vai tentar setar o valor que está campo(em string) a coluna(em bigdecimal) do model.
Quando tento recuperar no controller o valor do campo, ele retorna null. Acredito que seja porque não conseguiu fazer a conversão da string para bigdecimal.

Então preciso pegar os dados do formulário, fazer a conversão e só depois setar os atributos do meu objeto.

Aguardo, obrigado!

Os converters existem justamente para impedir que você recupere todos os dados como String e fique convertendo manualmente.

Imagine assim: toda vez que você precisar de um BigDecimal, o VRaptor vai converter para você…
Agora o contrário, toda vez que você precisar de um BigDecimal, você vai precisar receber uma String e convertê-la para BigDecimal e depois setar no seu objeto.

Está retornando null por que no final do meu exemplo eu coloquei um return null caso ele dê alguma exception (linha 16)…

Como você não viu o erro que aconteceu para poder arrumar o seu código, significa que você não tem o Log4J configurado no seu projeto, crie o seguinte arquivo na sua pasta src:
Coloque o nome dele de log4j.properties e substitua as informações necessárias. (Linha 2 e linha 9)

log4j.rootLogger=WARN,consoleAppender
log4j.logger.seu.pacote.principal=DEBUG,dailyFile

log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%-2d{dd/MM/yy HH:mm:ss} %5p %c:%L%n%m%n

log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.File=${catalina.home}/logs/nome-do-seu-projeto.log
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=%-2d{dd/MM/yy HH:mm:ss} %5p %c:%L%n%m%n

Rafael,

Desculpa a ignorância, novato em vraptor e java, sabe como é… rsrs
Acho que entendi agora.
Não cheguei usar seu exemplo, eu pensei que você estava entendendo de outra forma.
Mas criando o converter, o vraptor irá utilizar o mesmo para conversão, automático… é isso? rsrs

Melhor do que imaginava… :slight_smile: vou testar e aviso, obrigado!

Isso mesmo! Teste e coloque o log4j no seu projeto (o log4j evita bastante o uso do debug, quando a gente o usa corretamente).

Vou te mostrar como que ficaria a requisição:

JSP:

No seu controller:

public void salvarValor(BigDecimal valorImovel){ // valorImovel já vai estar convertido para você. }

Rafael, funcionou!!

Muito obrigado pela ajuda! Abs

Legal cara!

Edita o primeiro post e coloca “[Resolvido]” no assunto do post para saberem que foi resolvido e ajudar quem estiver visitando…