galera como faço pra validar os XML gerados de acordo com os xsd??
de presente essa
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package nfe;
/**
* @author dilnei cunha
* Classe para Validacao XML x XSD.
*/
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class XMLXSDValidate implements ErrorHandler {
private String xmlInput;
private String xsdInput;
public XMLXSDValidate(String xmlInput, String xsdInput) {
this.xmlInput = xmlInput;
this.xsdInput = xsdInput;
}
public String getXmlInput() {
return xmlInput;
}
public void setXmlInput(String xmlInput) {
this.xmlInput = xmlInput;
}
public String getXsdInput() {
return xsdInput;
}
public void setXsdInput(String xsdInput) {
this.xsdInput = xsdInput;
}
private void validate() throws Exception {
try {
//Setting Xerces-J parser because the standard parser not recognize <import ...>
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
// Parse an XML document em um DOM tree.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
DocumentBuilder parser = factory.newDocumentBuilder();
Document document = parser.parse(new File(xmlInput));
// Cria um SchemaFactory capaz de compreender WXS schemas.
SchemaFactory schemaFactory = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
// carrega um WXS schema, representada por uma instacia Schema.
Source schemaFile = new StreamSource(new File(xsdInput));
Schema schema = schemaFactory.newSchema(schemaFile);
// Cria um objeto Validator que pode ser usado para validar
// uma instancia document.
Validator validator = schema.newValidator();
validator.setErrorHandler(this);
// Valida o Dom tree
validator.validate(new DOMSource(document));
} catch (ParserConfigurationException e) {
throw new Exception(e.getMessage());
} catch (SAXException e) {
throw new Exception(e.getMessage());
} catch (IOException e) {
throw new Exception(e.getMessage());
}
}
@Override
public void error(SAXParseException exception) throws SAXException {
System.out.println("ERROR: " + exception.getMessage());
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.out.println("FATAL: " + exception.getMessage());
}
@Override
public void warning(SAXParseException exception) throws SAXException {
System.out.println("WARNING: " + exception.getMessage());
}
public static void main(String[] args) {
XMLXSDValidate validate = new XMLXSDValidate("res/00034929-env-lot.xml",
"Schema/enviNFe_v1.10.xsd");
try {
System.out.println("Starting parse..");
validate.validate();
System.out.println("File '"+validate.getXmlInput()+"' validate sucessfull...");
} catch (Exception ex) {
System.out.println("File '"+validate.getXmlInput()+"' validate fail...");
ex.printStackTrace();
}
}
}
[quote=aix]ola alguem ja tece esse erro ?
Server was unable to read request. ---> There is an error in XML document (1, 615). ---> The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type.
com.sun.xml.internal.ws.fault.SOAP12Fault.getProtocolException(SOAP12Fault.java:175)
com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:94)
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:240)
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:210)
com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:103)
$Proxy30.nfeStatusServicoNF2(Unknown Source)
[/quote]
Pocha pessoal, eu não acredito que ninguem tenha usado o JAX-WS, não acredito que ninguem possa me judar a resolver o problema que stou enfrentando, alguem ajuda ai, JAX-WS é a melhor API pra webservices, o que posso estar fazendo de errado ??? por favor, ja perdi o prazo de entrega, não posso perder mais que o prazo.
Abre teu XML na coluna 615. verifica qual é a tag.
Ele não esta conseguindo realizar o parse. Investiga lá o que pode estar errado…
[quote=gr_marco]Abre teu XML na coluna 615. verifica qual é a tag.
Ele não esta conseguindo realizar o parse. Investiga lá o que pode estar errado…[/quote]
Amigo obrigado por responder, meu xml não vai até o 615 vai até o 500, preciso ver o log do SOAP uso o netbeans e JAX-WS, como servidor uso tomcat, como posso fazer para habilitar o log e ver o conteudo do SOAP ?
Aix, o JAXWS, assim como todas as implementações da Sun, usam o JUL (Java Util Logging ou JDK Logging) para fazer logging das informações.
Não sei se você tem tempo de ler bem sobre o JDK Logging, mas o site onde você encontra todas as informações é: http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/overview.html
Basicamente o logging é dividido em categorias e níveis. Você configura o nivel para cada categoria, e ela exibe ou não as mensagens de logging. Desconheço qual a categoria do JAXWS, porém acho que é algo como javax.ws ou talvez com.sun.xml.
Pesquisando um pouco na documentação do JAXWS achei o seguinte parametro na inicialização da classe, caso você esteja rodando standalone, mas você pode usar no Tomcat também. Se não me engano para usar no Tomcat precisa ir no catalina.sh (ou catalina.bat no windows).
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=“true”
Segundo a documentação será gerado um dump do envelope no console padrão.
Dê uma analisada em um artigo no dev.java.net sobre como monitorar SOAP: http://weblogs.java.net/blog/ramapulavarthi/archive/2006/08/monitoring_soap.html
:thumbup:
Não esqueça de reportar o resultado aqui depois.
erro ao tentar validar o xml:
Exception in thread “main” javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found
at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:129)
at nfe.XMLXSDValidate.validate(XMLXSDValidate.java:63)
at nfe.XMLXSDValidate.main(XMLXSDValidate.java:112)
Fala pessoal,
fafb, vc encontra essa classe no package xercesImpl-2.6.2.jar por exemplo.
nao, nao!!
peguei aki no forum mesmo nesses mesmo topico aki, olha ai na pagina 35 q tem ele lah.
vlw galera, ja resolvi o problema !!
Bom aix, engalhei no mesmo problema quando estava tentando implementar com o jax-ws e logo ajustei para usar o axis2, como o projeto esta bem desacoplado, a alteração das das classes stubs não causa muito impacto. Porém fiquei desapontado com a quantidade de jars que precisarei incorporar no meu projeto para usar o axis2, e tentei novamente trabalhar com o jax-ws.
Dessa vez fui um pouco mais longe, consegui enviar os dados para o webservice da receita, porém, como para estes novos schemas o jax-ws cria classes wrappers para manipular os dados, é necessário usar os mecanismos de Marshaller e Unmarshaller para converter os objetos em String e vice e versa, e é nesse momento que tive problemas, pois não consegui remover os namespaces e recebi uma rejeição da receita: >Rejeicao: Uso de prefixo de namespace nao permitido<.
Aparentemente é possível de se resolver, mas não tenho tempo para fazer isso, pois estou saindo da empresa que estou atualmente e não posso perder tempo nisso pois estou trabalhando em outras coisas, vou deixar aqui os passos que fiz até então e espero que você tenha alguma progresso.
String nfeDadosMsg = "<nfeDadosMsg><consStatServ " + " versao=\"2.00\""
+ " xmlns=\"http://www.portalfiscal.inf.br/nfe\">"
+ "<tpAmb>2</tpAmb>" + "<cUF>35</cUF>"
+ "<xServ>STATUS</xServ>" + "</consStatServ></nfeDadosMsg>";
NfeStatusServico2 nfeStatusServico = new NfeStatusServico2(new URL("https://hom.sefazvirtual.fazenda.gov.br/NfeStatusServico2/NfeStatusServico2.asmx"));
JAXBContext jaxbContext = JAXBContext.newInstance(NfeDadosMsg.class);
Unmarshaller unMarshaller = jaxbContext.createUnmarshaller();
JAXBElement<NfeDadosMsg> element = (JAXBElement<NfeDadosMsg>) unMarshaller.unmarshal(new StreamSource(new ByteArrayInputStream(nfeDadosMsg.getBytes())), NfeDadosMsg.class);
NfeDadosMsg cteDadosMsg = element.getValue();
nfeStatusServico.setHandlerResolver(new HandlerResolver() {
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlers = new ArrayList<Handler>();
handlers.add(new br.com.ksisolucoes.nfe.ws.conf.NfeStatusServico2Handler());
return handlers;
}
});
NfeStatusServicoNF2Result result = nfeStatusServico.getNfeStatusServico2Soap12().nfeStatusServicoNF2(cteDadosMsg);
StringWriter ret = new StringWriter();
Marshaller m = jaxbContext.createMarshaller();
m = jaxbContext.createMarshaller();
m.marshal(result, ret);
System.out.println(ret);
Classe NfeStatusServico2Handler
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
/**
*
* @author klaus
*/
public class NfeStatusServico2Handler implements SOAPHandler<SOAPMessageContext> {
public boolean handleMessage(SOAPMessageContext messageContext) {
try {
if (messageContext.getMessage().getSOAPPart().getEnvelope().getHeader() == null) {
SOAPHeader header = messageContext.getMessage().getSOAPPart().getEnvelope().addHeader();
SOAPHeaderElement headerElement = header.addHeaderElement(new QName("http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2", "nfeCabecMsg", "nfeCabecMsg"));
SOAPHeaderElement headerCUF = header.addHeaderElement(new QName("http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2", "cUF"));
headerCUF.setValue("35");
SOAPHeaderElement headerVersaoDados = header.addHeaderElement(new QName("http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2", "versaoDados"));
headerVersaoDados.setValue("2.00");
headerElement.addChildElement(headerCUF);
headerElement.addChildElement(headerVersaoDados);
}
} catch (SOAPException ex) {
Logger.getLogger(NfeStatusServico2Handler.class.getName()).log(Level.SEVERE, null, ex);
}
return true;
}
public Set<QName> getHeaders() {
return new TreeSet<QName>();
}
public boolean handleFault(SOAPMessageContext messageContext) {
return true;
}
public void close(MessageContext context) {
}
}
Abraço…
Galera, galera…
estou com um problema…
Meu aplicativo funciona com os certificados .PFX (arquivo) e com o Token(cartao), porem com o token que é USB nao…
alguem sabe o “pulo gato”, a diferença ?
Valew
[quote=klaus]Bom aix, engalhei no mesmo problema …
[/quote]
Ola Klaus, darei seguimento sim, assim que conseguir posto aqui a solução vlw pelo iteresse em ajudar, abraços.
[quote=guilherme_ha]Galera, galera…
estou com um problema…
Meu aplicativo funciona com os certificados .PFX (arquivo) e com o Token(cartao), porem com o token que é USB nao…
alguem sabe o “pulo gato”, a diferença ?
Valew[/quote]
Entre smartcard e token é praticamente o driver a ser instalado.
Para cartão, tem a leitora e o provider do fabricante do cartão.
Para o token, deve ter um pacote a ser instalado.
No mais, segue o mesmo padrão.
Alencar
e ai Galera blz
Na hora de validar um XML , tem como os retornos de erros estar vindo em portugues ?
e ai galera ninguem tem ideia de como retornar em portugues os erros da validação do xml , no caso ficar igual ao programa ASSINADOR RS , volta os msm erros só q na minha aplicação esta td em ingles
Pessoal, a atualização do JRE para versão 1.6.0_19 está trazendo problemas de
exceção.
Voltando para a versão _18 tudo volta a funcionar.
Alguém sabe de alguma coisa, além do que já saiu no site da NFe?
Como ajustar as classes para não dar este erro caso o usuário atualize seu java?
Grato
Alencar
Pessoal…
A receita disponibiliza algum certificado para teste?
ou para mim ter acesso aos serviços deles eu tenho que comprar um certificado digital??
[quote=looljunior]Pessoal…
A receita disponibiliza algum certificado para teste?
ou para mim ter acesso aos serviços deles eu tenho que comprar um certificado digital??
[/quote]
os de testes quando eu testei servia só pra assinar a nota e testar localmente, mas para consumir os webservices tive que usar o certificado quente, abraços.
[quote=aix][quote=looljunior]Pessoal…
A receita disponibiliza algum certificado para teste?
ou para mim ter acesso aos serviços deles eu tenho que comprar um certificado digital??
[/quote]
os de testes quando eu testei servia só pra assinar a nota e testar localmente, mas para consumir os webservices tive que usar o certificado quente, abraços. [/quote]
Onde eu consigo o certificado para teste?
na verdade é exatamente isso que preciso fazer agora, adiconar a assinatura no arquivo…