VRaptor Validator com JSON e messages.properties [Resolvido]

2 respostas
N

Bom dia,

Estou desenvolvendo um sistema com VRaptor 3.3.1 em que todas as requisições são realizadas via ajax, porém estou tendo problemas em retornar as mesagens de erro no formato json, lendo um arquivo properties com as mensagens internacionalizadas. Estou utilizando o seguinte código:

List<Message> errors = new Validations() {{  
      that(fileNotIsValid(), "error", "file.invalid");  
 }}.getErrors();  
 validator.addAll(errors);  
 validator.onErrorUse(json()).from(errors).serialize();

Quando realizo uma validação da forma abaixo (sem ajax), ele funciona normalmente com a mensagem vindo do arquivo message.properties.

validator.checking(new Validations() {
		{
			that(fileNotIsValid(), "error", "file.invalid");
		}
	});
	validator.onErrorUse(logic()).redirectTo(FileController.class).viewFile();

Qunado uso o json() ele retorna:

Agradeço a ajuda,
Obrigado a todos!

2 Respostas

Lucas_Cavalcanti

use isso:

validator.checking(new Validations() {  
    {  
        that(fileNotIsValid(), "error", "file.invalid");  
    }  
});  
validator.onErrorSendBadRequest();

assim o status code fica 400 e ele serializa os erros usando o que o request pediu.
Se vc usa $.getJSON(), $.ajax com dataType: json, ou coisa do tipo, os erros são serializados em json.

ainda assim é possível que ele não serialize a mensagem internacionalizada. Isso pq o XStream serializa os fields direto, e não usando os getters.

daí o que vc pode fazer é registrar um converter pra isso, sobrescrevendo o JSON serialization do VRaptor:

@Component
public class CustomJSONSerialization extends XStreamJSONSerialization {

   //delegate constructor

   @Override
   protected XStream getXStream() {
         XStream stream = super.getXStream();

         stream.registerConverter(new Converter() { //do xstream
               public boolean canConvert(Class type) {
                     return Message.class.isAssignableFrom(type);
               }
               //unmarshall vazio
               public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
                     Message m = (Message) source;
                     writer.startNode("message");
                     writer.setValue(m.getMessage());
                     writer.endNode();

                     writer.startNode("category");
                     writer.setValue(m.getCategory());
                     writer.endNode();
               }
         };
         return stream;
   }
}
N

Lucas,

Funcionou 100% :smiley:

Muito Obrigado mesmo!

Criado 24 de fevereiro de 2011
Ultima resposta 24 de fev. de 2011
Respostas 2
Participantes 2