Msg validação xml

5 respostas
vanderlanio

Pessoal

Alguém sabe como internacionalizar as mensagens de erro lançadas pela validação xsd ???

Obrigado

5 Respostas

lindberg713

O que exatamente você quer dizer com validação xsd? Ta se referindo ao bean validation? Ou validação de um xml qualquer baseado em um xsd utilizando alguma api da vida ai?

vanderlanio

Amigo , e uma validação de um xml qualquer baseado em um xsd utilizando alguma JAXB, preciso customiza as mensagens de erro que são lançadas na validação.

lindberg713

Cara, para fazer isso você precisa implementar um ErrorHandler. Fiz um exemplo aqui pra vc.

Classe de teste

import java.io.File;
import java.io.FileReader;

import javax.xml.XMLConstants;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

public class Teste {

	public static void main(String[] args) throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
        Schema schema = sf.newSchema(new File("pessoa.xsd"));
        spf.setSchema(schema);

        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setErrorHandler(new CustomErrorHandler());
        
        InputSource xml = new InputSource(new FileReader("pessoa.xml"));
        xr.parse(xml);
    }
}

ErrorHandler

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class CustomErrorHandler implements ErrorHandler {

    public CustomErrorHandler() {
        //
    }

	@Override
	public void error(SAXParseException ex) throws SAXException {
		//SUA MSG CUSTOMIZADA PARA ERRO
		System.out.println("Ocorreu um problema na validação do XML na linha "+ex.getLineNumber()+
				" na coluna "+ex.getColumnNumber()+" : "+ex.getMessage());
	}

	@Override
	public void fatalError(SAXParseException ex) throws SAXException {
		//SUA MSG CUSTOMIZADA PARA ERRO FATAL
		System.out.println("Ocorreu um erro grave na validação do XML : "+ex.getMessage());
	}

	@Override
	public void warning(SAXParseException ex) throws SAXException {
		System.out.println("Avido de validação do XML : "+ex.getMessage());
	}

}

Classe Pessoa

import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement
public class Pessoa {

    private String nome;
    private String cpf;
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
    
}

SCHEMA

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="pessoa">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="nome" type="xs:string" />
                <xs:element name="cpf" type="xs:string" minOccurs="1" />
             </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

pessoa.xml faltando a tag que ocasionará em um erro de validação

<?xml version="1.0" encoding="UTF-8"?>
<pessoa>
   <nome>lindberg</nome>
</pessoa>

pessoa.xml cum um namespace inválido que ocasionará em um erro FATAL de validação

<?xml version="1.0" xmlns="bla bla bla" encoding="UTF-8"?>
<pessoa>
   <nome>lindberg</nome>
</pessoa>

Bom é isso. Espero ter ajudado.

vanderlanio

Amigo, antes de tudo gostaria de agradecer pelo exemplo e pela atenção dada ao meu problema, minha implementação já faz uso de um ErrorHandler a minha intensão era
internacionalizar a mensagem lançada pelo SaxParseException ou seja ( ex.getMessage() vim em português ) , nem sei se isso seria possivel, pensei em sei lá sobrescrever uma chave ou um arquivo properties da propria api JAXB.

lindberg713

É cara, ai vai ter que dar uma pesquisada. Fiz uma busca rápida para ver se era algo trivial, alguma configuração ou algo do tipo mas sem sucesso. Dei uma olhada também em SchemaFactory e observei que tem um método lá chamado setResourceResolver, não vi a fundo do que se trata mas pode dar uma olhada e ver o que de fato faz. De repente é um extension point da API que lhe permite customizar o resolvedor de recursos a partir dos properties, repisto nao vi a fundo entao nao sei se realmente faz isso. Mas vc pode dar uma olhada e verificar.

Com certeza deve ter como fazer sim mas eu teria que parar um tempo pra me aprofundar e ler a documentação do jaxb. To cheio de coisa no momento, mas você pode ir postando ai seus avanços e descobertas que vamos ajudando até você encontrar a solução.

Criado 5 de março de 2012
Ultima resposta 6 de mar. de 2012
Respostas 5
Participantes 2