Olá a todos,
Tenho uma aplicação webservice que valida um arquivo xml contra 2 schemas: xsd1 e xsd2. O xsd1 possui um elemento definido no xsd2(que define o schema de assinatura digital), então para ser reconhecido utilizo a tag <xs:import>:
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="xmldsig-core-schema_v1.00.xsd" />
Tenho uma classe para validação desse xml, e quando executo o teste no desktop, tudo sai OK. O xsd1 consegue encontrar a referência do elemento no schema da assinaura digital(xsd2), pois os 2 encontram-se na mesma pasta.
Agora o problema é quando coloco em um war. O xsd1 não consegue encontrar através do atributo ‘schemaLocation’ o xsd2.
Abaixo a classe utilizada para validar o xml. Os 2 schemas são carregados corretamente através do getResourceAsStream. O erro é exibido na hora do parse: ’ Error (2868, 37): src-resolve: Cannot resolve the name ‘ds:Signature’ to a(n) ‘element declaration’ component., ’
/**
*
* <p>Classe responável por validar um documento xml utilizando vários xml schemas.</p>
*/
public class XmlSchemaValidator {
/**
* Lista dos nomes dos schemas. Os Schemas devem estar no classpath da aplicação.
*/
private List schemas;
/** uma instância de <code>SchemaValidator</code>
*/
public XmlSchemaValidator() {
}
public void setSchemas(List schemas) {
this.schemas = schemas;
}
public List getSchemas() {
return schemas;
}
/**
* Retorna um org.w3c.dom.Document se o documento estiver de
* acordo com os schemas.
* @param document Arquivo xml a ser validado.
* @return um org.w3c.dom.Documen se o documento for válido.
*/
public Document validate(Object document){
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
factory.setAttribute(
"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
//path xsd1=/xsd1
//path xsd2=/xsd2
InputStream[] schemasUrls = new InputStream[schemas.size()];
/* criando as inputstreams para cada schema através do path*/
for (int i = 0; i < schemas.size(); i++) {
String schemaName = (String) schemas.get(i);
schemasUrls[i] = this.getClass().getResourceAsStream(schemaName);
}
factory.setAttribute(
"http://java.sun.com/xml/jaxp/properties/schemaSource",
schemasUrls);
try {
DocumentBuilder docBuilder = factory.newDocumentBuilder();
DefaultErrorHandler defErrorHandler = new DefaultErrorHandler();
docBuilder.setErrorHandler(defErrorHandler);
org.w3c.dom.Document w3cDocument = docBuilder.parse(
new ByteArrayInputStream( ((String) document).getBytes()));
if(!defErrorHandler.getErrorMessages().isEmpty()){
//exibe os erros
defErrorHandler.getErrorMessages().toString();
throw new IllegalStateException("XML does not conform to XMLSchema.");
}
return w3cDocument;
}
catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}
Bem é isso, já tentei de todo jeito e ainda não consegui resolver o problema no .WAR. Qualquer sugestão é bem-vinda. Valeu