FaultException com código gerado pelo SlSvcUtil

Eu tenho um WebService com o seguinte arquivo wsdl:

<?xml version='1.0' encoding='UTF-8'?>
 
  
  
  

  
  
  
  
  
  
  
  
  
    

      
        
        
      
    
    
      
        
        
        
      
    
  
  
  
  
  
  
  
  
  
  
  
    
    
      
      
    
    
      
      
    
    
      
        
      
        
      
      
    
    
      
      
        
        
          
        
        
          
        
      
    

    
      
        
      
    
  

Eu usei o SlSvcUtil do Windows Phone SDK para gerar as classes de proxy para C# SlSvcUtil.exe test.wsdl .

Isso é uma parte do código gerado:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="getPOI", WrapperNamespace="com.test", IsWrapped=true)]
public partial class getPOI {

        [System.ServiceModel.MessageBodyMemberAttribute(Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public int ID;

        public getPOI() {
        }

        public getPOI(int ID) {
            this.ID = ID;
        }
}

private class BBAppWebAccessClientChannel : ChannelBase, BBAppWebAccess
{

    public BBAppWebAccessClientChannel(System.ServiceModel.ClientBase client) : 
            base(client)
    {
    }

    public System.IAsyncResult BegingetPOI(getPOI request, System.AsyncCallback callback, object asyncState)
    {
        object[] _args = new object[1];
        _args[0] = request;
        System.IAsyncResult _result = base.BeginInvoke("getPOI", _args, callback, asyncState);
        return _result;
    }

    public getPOIResponse EndgetPOI(System.IAsyncResult result)
    {
        object[] _args = new object[0];
        getPOIResponse _result = ((getPOIResponse)(base.EndInvoke("getPOI", _args, result)));
        return _result;
    }
}

A FaultException é lançada por esse getPOIResponse _result = ((getPOIResponse) (base.EndInvoke ("getPOI", _args, resultado))); .

Eu chamo o WebService com o seguinte código:

private void Load_Initial_Data()
{
    try
    {
        BBAppWebAccessClient wac = new BBAppWebAccessClient();
        wac.getPOICompleted += new EventHandler(client_GetDataCompleted);
        wac.getPOIAsync(1);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.StackTrace);
    }

}
void client_GetDataCompleted(object sender, getPOICompletedEventArgs e)
{
    //this.DataContext = e.Result;
    Console.WriteLine(e.Result.poiID);
}

No lado do servidor, há a seguinte exceção:

22:27:23,789 WARN  [org.apache.cxf.phase.PhaseInterceptorChain] Interceptor for {com.test}BBAppWebAccessService#{com.test}getPOI has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"com.test", local:"ID").
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:787) [:2.3.1-patch-01]
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:628) [:2.3.1-patch-01]
        at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:133) [:2.3.1-patch-01]
        at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109) [:2.3.1-patch-01]
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255) [:2.3.1-patch-01]
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) [:2.3.1-patch-01]
        at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:97) [:2.3.1-patch-01]
        at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) [:2.3.1-patch-01]
        at org.jboss.wsf.stack.cxf.ServletControllerExt.invoke(ServletControllerExt.java:172) [:3.4.1.GA]
        at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:57) [:3.4.1.GA]
        at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:156) [:3.4.1.GA]
        at org.jboss.wsf.stack.cxf.CXFNonSpringServletExt.invoke(CXFNonSpringServletExt.java:90) [:3.4.1.GA]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) [:2.3.1-patch-01]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103) [:2.3.1-patch-01]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [:1.0.0.Final]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) [:2.3.1-patch-01]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.1.0.Final]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [:6.1.0.Final]
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0.Final]
        at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final]
        at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final]
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final]
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.1.0.Final]
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final]
        at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final]
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final]
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final]
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final]
        at java.lang.Thread.run(Unknown Source) [:1.7.0]
Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 197; unexpected element (uri:"com.test", local:"ID"). Expected elements are <{}ID>]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:425) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339) [:2.2]
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:764) [:2.3.1-patch-01]
        ... 34 more
Caused by: com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 197; unexpected element (uri:"com.test", local:"ID"). Expected elements are <{}ID>
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:101) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:243) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:242) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:176) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360) [:2.2]
        ... 36 more
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"com.test", local:"ID"). Expected elements are <{}ID>
        ... 47 more

ClientConfig:

<?xml version="1.0" encoding="utf-8"?>

    
        
            
                
                    
                
            
        
        
            
        
    

Mensagem capturada com o Fiddler (Windows Phone):


    
        
            1
        <
    /s:Body>

Mensagem capturada com o Fiddler (Axis2):


    
        
            1
        
    

Como posso consertar isso? O código java gerado (Apache Axis2) funciona muito bem.

Obrigado por qualquer conselho.

0
Sim, tentei e recebi o mesmo erro também. Mas sinta-se à vontade para testá-lo por conta própria e informar sobre seus resultados.
adicionado o autor CSchulz, fonte
Não há serviço online, porque está em desenvolvimento. Sinto muito.
adicionado o autor CSchulz, fonte
Eu adicionei o ClientConfig. Espero que seja a configuração correta.
adicionado o autor CSchulz, fonte
Isso pode ser um problema de configuração. Você já tentou gerar o código usando 'Add Service Reference' no Visual Studio?
adicionado o autor calum, fonte
Vou precisar do endereço do serviço.
adicionado o autor calum, fonte
ESTÁ BEM. Se você postar sua configuração, ainda poderei ajudar.
adicionado o autor calum, fonte

2 Respostas

Eu encontrei a solução. Quando você está criando o WebService com Java EE, você precisa adicionar todos os namespaces, caso contrário, você obterá os erros acima. Depois de consertar o FaultException , eu recebi um NullReferenceException , o que indica que eu tenho que consertar o tratamento de resposta também.

Muito obrigado a @calum .

Aqui está uma implementação de amostra do WebService, que funciona junto com o Axis2 e a ferramenta SLsvcUtil:

package com.test;

//imports here

@WebService(targetNamespace = "com.test")
public class BBAppWebAccess {
    @WebMethod
    @WebResult(targetNamespace="com.test.poi")
    public POI getPOI(
            @WebParam(name="ID", targetNamespace="com.test.poi")
            int id) {

        return new POI(id);
    }
}

A nova mensagem parece com a seguinte:


    
        
            1
        
    

A nova classe gereted getPOI :

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="getPOI", WrapperNamespace="com.test", IsWrapped=true)]
public partial class getPOI {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="com.test.poi", Order=0)]
    public int ID;

    public getPOI() {
    }

    public getPOI(int ID) {
        this.ID = ID;
    }
}
2
adicionado
Que bom que você está trabalhando, você deve marcar este post como a resposta.
adicionado o autor calum, fonte

Parece que você está enviando o serviço ao tipo errado (suponho que o erro indica que um 'ID' de elemento inesperado foi encontrado e isso significa que sua solicitação não foi formada corretamente). Use o violinista (se possível) para ver o que você está enviando para o servidor. Você provavelmente será capaz de descobrir o que está acontecendo e, em seguida, você pode atualizar o código gerado para que o tipo correto seja enviado.

1
adicionado
Eu adicionei as duas mensagens capturadas com o Fiddler acima, a única diferença é o namespace e eu não sei como corrigi-lo
adicionado o autor CSchulz, fonte
Código adicionado, espero que você possa me ajudar.
adicionado o autor CSchulz, fonte
Nenhuma mudança, é a mesma mensagem de violinista.
adicionado o autor CSchulz, fonte
Você pode por favor postar a definição da classe getPOI.
adicionado o autor calum, fonte
Funciona se você remover o WrapperNamespace no MessageContractAttribute? Se não, por favor poste a saída do violinista.
adicionado o autor calum, fonte
Então, depois de remover o namespace do wrapper, você ainda obtém na solicitação ?? Você precisa ajustar os atributos até que o elemento esteja qualificado (como no outro exemplo) ou não haja nenhum namespace (). O problema com a solicitação é que o namespace não é qualificado, portanto, o elemento ID está automaticamente no namespace com.test, em vez de não ser qualificado. Tente definir o namespace do wrapper como uma string vazia (ou o membro Namespace do MessageBodyMemberAttribute na propriedade ID).
adicionado o autor calum, fonte
Técnicos em Informática
Técnicos em Informática
2 517 dos participantes

Um grupo com foco em assuntos técnicos, hardware, servidores e resolução de problemas em Windows e Linux. Canal: @dicasdeti