2011-07-27 4 views
5

Me estoy golpeando la cabeza contra la API de jabón con el siguiente código. Mi objetivo es crear un ticket con campos personalizados. Si comenta la parte del campo personalizado, este código funciona bien. ¿Alguna idea de lo que está pasando?Problemas al crear un problema en JIRA con Custom Fields con Soap Lite y perl

Código

my $soap = SOAP::Lite->service($wsdl); 
my $token = $soap->login($_jira_user,$_jira_pass); 

my $customFields = [ 
    {'customFieldId' => $_cf_map{'severity'},'values' => [SOAP::Data->type('string', $severity)]}, 
    {'customFieldId' => $_cf_map{'outage_start'}, 'values' => [SOAP::Data->type('string', $start)]}, 
    {'customFieldId' => $_cf_map{'no_auto_close'}, 'values' => [SOAP::Data->type('string', $no_auto_close == 1 ? 'Yes': 'No')]}, 
    {'customFieldId' => $_cf_map{'nco_serials'}, 'values' => [SOAP::Data->type('string', $serial_string)]}, 
    {'customFieldId' => $_cf_map{'services'}, 'values' => \@services}, 
]; 

my $remoteIssueHash = { 
    'project' => SOAP::Data->type('string' => $_projectkey), 
    'type' => SOAP::Data->type('string' => $_issuetype), 
    'summary' => SOAP::Data->type('string' => $summary), 
    'reporter' => SOAP::Data->type('string' => $user), 
    'assignee' => SOAP::Data->type('string' => $user), 
    'customFieldValues' => $customFields, 
}; 

my $remote_issue = $soap->call('createIssue', $token, $remoteIssueHash); 
print Dumper [$remote_issue->faultcode(), $remote_issue->faultstring(), $soap->transport()->status(), $remote_issue->result(), $remote_issue ] 
exit(); 

salida

$VAR1 = [ 
     'soapenv:Server.userException', 
     'org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType', 
     '500 Internal Server Error', 
     #big soap object 
     ] 

XML enviados

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:tns2="http://exception.rpc.jira.atlassian.com" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:namesp1="http://soap.rpc.jira.atlassian.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns1="http://beans.soap.rpc.jira.atlassian.com" xmlns:impl="http://jira.nyc.hcmny.com:8080/rpc/soap/jirasoapservice-v2" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <soap:Body> 
      <namesp1:createIssue> 
        <c-gensym6 xsi:type="xsd:string">Y6DQd1k2BL</c-gensym6> 
        <c-gensym8> 
         <assignee xsi:type="xsd:string">fgulotta</assignee> 
         <customFieldValues soapenc:arrayType="xsd:anyType[5]" xsi:type="soapenc:Array"> 
           <item> 
            <customFieldId xsi:type="xsd:string">customfield_10094</customFieldId> 
            <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
              <item xsi:type="xsd:string">4</item> 
            </values> 
            <key xsi:type="xsd:string" /> 
           </item> 
           <item> 
            <customFieldId xsi:type="xsd:string">customfield_10084</customFieldId> 
            <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
              <item xsi:type="xsd:string">29/Jul/11 05:46 PM</item> 
            </values> 
            <key xsi:type="xsd:string" /> 
           </item> 
           <item> 
            <customFieldId xsi:type="xsd:string">customfield_10100</customFieldId> 
            <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
              <item xsi:type="xsd:string">Yes</item> 
            </values> 
            <key xsi:type="xsd:string" /> 
           </item> 
           <item> 
            <customFieldId xsi:type="xsd:string">customfield_10093</customFieldId> 
            <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
              <item xsi:type="xsd:string" /> 
            </values> 
            <key xsi:type="xsd:string" /> 
           </item> 
           <item> 
            <customFieldId xsi:type="xsd:string">customfield_10080</customFieldId> 
            <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
              <item xsi:type="xsd:string">intranet</item> 
            </values> 
            <key xsi:type="xsd:string" /> 
           </item> 
         </customFieldValues> 
         <summary xsi:type="xsd:string">This is a test ticket.</summary> 
         <project xsi:type="xsd:string">MON</project> 
         <type xsi:type="xsd:string">31</type> 
         <reporter xsi:type="xsd:string">fgulotta</reporter> 
        </c-gensym8> 
      </namesp1:createIssue> 
     </soap:Body> 
</soap:Envelope> 

XML RECIBIDO

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <soapenv:Body> 
      <soapenv:Fault> 
        <faultcode>soapenv:Server.userException</faultcode> 
        <faultstring>org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType</faultstring> 
        <detail> 
         <faultData xsi:type="ns1:SAXException" xmlns:ns1="http://sax.xml.org"> 
           <exception xsi:type="ns2:Exception" xsi:nil="true" xmlns:ns2="http://lang.java"/> 
           <message xsi:type="xsd:string">No deserializer for {http://www.w3.org/2001/XMLSchema}anyType</message> 
         </faultData> 
         <ns3:hostname xmlns:ns3="http://xml.apache.org/axis/">deputy.811t.hcmny.com</ns3:hostname> 
        </detail> 
      </soapenv:Fault> 
     </soapenv:Body> 
</soapenv:Envelope> 

Actualizado Se corrigieron los nombres de los campos y se pusieron valores en las matrices de cadenas, pero todavía hay problemas.

2da actualización Encontré un código de java que funciona en contra del servicio de jabón y corrí mis pruebas en contra de eso. Luego usé wireshark para oler el xml. Ignorar el multirefs es una estructura muy similar, pero no estoy seguro de cómo modelarlo con Soap :: Lite.

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <soapenv:Body> 
      <ns1:createIssue soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soap.rpc.jira.atlassian.com"> 
        <in0 xsi:type="xsd:string">B2P69v5NrS</in0> 
        <in1 href="#id0"/> 
      </ns1:createIssue> 
      <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:RemoteIssue" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://beans.soap.rpc.jira.atlassian.com"> 
        <id xsi:type="xsd:string" xsi:nil="true"/> 
        <affectsVersions xsi:type="ns2:RemoteVersion" xsi:nil="true"/> 
        <assignee xsi:type="xsd:string">fgulotta</assignee> 
        <attachmentNames xsi:type="xsd:string" xsi:nil="true"/> 
        <components xsi:type="ns2:RemoteComponent" xsi:nil="true"/> 
        <created xsi:type="xsd:dateTime" xsi:nil="true"/> 
        <customFieldValues soapenc:arrayType="ns2:RemoteCustomFieldValue[3]" xsi:type="soapenc:Array"> 
         <customFieldValues href="#id1"/> 
         <customFieldValues href="#id2"/> 
         <customFieldValues href="#id3"/> 
        </customFieldValues> 
        <description xsi:type="xsd:string" xsi:nil="true"/> 
        <duedate xsi:type="xsd:dateTime" xsi:nil="true"/> 
        <environment xsi:type="xsd:string" xsi:nil="true"/> 
        <fixVersions xsi:type="ns2:RemoteVersion" xsi:nil="true"/> 
        <key xsi:type="xsd:string" xsi:nil="true"/> 
        <priority xsi:type="xsd:string" xsi:nil="true"/> 
        <project xsi:type="xsd:string">MON</project> 
        <reporter xsi:type="xsd:string">fgulotta</reporter> 
        <resolution xsi:type="xsd:string" xsi:nil="true"/> 
        <status xsi:type="xsd:string" xsi:nil="true"/> 
        <summary xsi:type="xsd:string">This is a test ticket.</summary> 
        <type xsi:type="xsd:string">31</type> 
        <updated xsi:type="xsd:dateTime" xsi:nil="true"/> 
        <votes xsi:type="xsd:long" xsi:nil="true"/> 
      </multiRef> 
      <multiRef id="id2" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:RemoteCustomFieldValue" xmlns:ns3="http://beans.soap.rpc.jira.atlassian.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 
        <customfieldId xsi:type="xsd:string">customfield_10094</customfieldId> 
        <key xsi:type="xsd:string" xsi:nil="true"/> 
        <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
         <values xsi:type="xsd:string">4</values> 
        </values> 
      </multiRef> 
      <multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns4:RemoteCustomFieldValue" xmlns:ns4="http://beans.soap.rpc.jira.atlassian.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 
        <customfieldId xsi:type="xsd:string">customfield_10084</customfieldId> 
        <key xsi:type="xsd:string" xsi:nil="true"/> 
        <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
         <values xsi:type="xsd:string">27/Jul/11 02:21 PM</values> 
        </values> 
      </multiRef> 
      <multiRef id="id3" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns5:RemoteCustomFieldValue" xmlns:ns5="http://beans.soap.rpc.jira.atlassian.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 
        <customfieldId xsi:type="xsd:string">customfield_10100</customfieldId> 
        <key xsi:type="xsd:string" xsi:nil="true"/> 
        <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array"> 
         <values xsi:type="xsd:string">Yes</values> 
        </values> 
      </multiRef> 
     </soapenv:Body> 
</soapenv:Envelope> 

Respuesta

2

Logré crear un problema (requisito) usando perl con SOAP :: Lite. La clave es construir la solicitud usando matrices y definir los tipos usando SOAP :: Data-> type(). No pude completar la versión de corrección con el atributo 'fixVersions', pero lo hice a través del campo personalizado 'customfield_10040'. Puede usar la llamada getItem() para verificar cuál se usa en su caso.

my $soap = SOAP::Lite->service($URI); 
my $token = $soap->login($USERNAME,$PASSWORD); 

my $fieldValues = [ 
    SOAP::Data->type('RemoteCustomFieldValue', {'customfieldId' => 'customfield_10040', 
               'values' => [ 
                SOAP::Data->type('string', '10051'), 
                SOAP::Data->type('string', '10052') 
                  ] 
               }),]; 
my $affectedValues = [ 
    SOAP::Data->type('RemoteVersion', {'name' => 'FINS 1.16.1', 
             'id' => SOAP::Data->type('string', '10051')}), 
    SOAP::Data->type('RemoteVersion', {'name' => 'FINS 1.16.1a', 
             'id' => SOAP::Data->type('string', '10052')}) 
        ]; 
my $fixedValues = [ 
        SOAP::Data->type('RemoteVersion', {'name' => 'FINS 1.16.1', 
                 'id' => SOAP::Data->type('string', '10051')}) 
        ]; 
my $customFields = SOAP::Data->type('RemoteCustomFieldValue', $fieldValues); 
my $fixVersion  = SOAP::Data->type('RemoteVersion' , $fixedValues); 
my $affectedVersion = SOAP::Data->type('RemoteVersion' , $affectedValues); 
my $component  = SOAP::Data->type('RemoteComponent', \{'name' => 'CST', 'id' => SOAP::Data->type('string', '10194')}); 

my $remoteIssueHash = { 
    'project'   => SOAP::Data->type('string' => $PROJECT), 
    'type'    => SOAP::Data->type('string' => 10), 
    'summary'   => SOAP::Data->type('string' => $summary), 
    'reporter'   => SOAP::Data->type('string' => $reporter), 
    'assignee'   => SOAP::Data->type('string' => $assignee), 
    'customFieldValues' => SOAP::Data->type('array' => $customFields), 
    'affectsVersions' => SOAP::Data->type('array' => $affectedVersion), 
    'components'  => SOAP::Data->type('array' => $component), 
    'fixVersions'  => SOAP::Data->type('array' => $fixVersion), ## this doesn't do anything 
    'description'  => SOAP::Data->type('string' => $description), 
    'environment'  => SOAP::Data->type('string' => 'Some environment'), 
}; 

my $remote_issue = $soap->call('createIssue', $token, $remoteIssueHash); 
print Dumper [$remote_issue->faultcode(), $remote_issue->faultstring(), $soap->transport()->status(), $remote_issue->result(), $remote_issue ]; 
exit(); 

Buena suerte con eso.

Daniel

+0

¡Tú ganas! El tipo "SOAP :: Data-> ('RemoteCustomFieldValue', {})" funcionó perfectamente. – reconbot

1

createIssue toma un objeto RemoteIssue. El objeto RemoteIssue tiene una matriz denominada customFieldValues ​​of RemoteCustomFieldValue objects. Todo bien hasta ahora. Un objeto RemoteCustomFieldValue tiene un campo llamado customfieldfield (no "id" como lo ha hecho) y una matriz String llamada "values". Parece que $ severity no es una matriz?

Todo esto proviene de la fuente de Java para RemoteIssue y RemoteCustomFieldValue. Los errores SOAP casi siempre son inútiles en mi experiencia.

~ Matt

+0

He cambió el nombre del campo id a "customFieldId" y poner los valores de las matrices con aún ninguna suerte. – reconbot

+0

Ejemplo de código actualizado y referido a la fuente Jira, pero todavía no veo cómo el objeto está equivocado. – reconbot

0

he renunciado a tratar de dar sentido a SOAP::Lite. Fui gravemente mordido por las formas imprevistas de ese módulo en 2005 y he aprendido a evitar usarlo.

Muchas veces, un simple LWP más XML::LibXML para construir el DOM es suficiente.

Incluso podría estar en posición de codificar el documento XML como una cadena en su programa y simplemente interpolar variables. No es bonito, pero suficiente en algunas situaciones.

Ahora se enfrenta a un archivo WSDL y es probable que su escenario no sea trivial. (No sé).

Recientemente me enteré de la existencia del excelente conjunto de módulos XML::Compile de Mark Overmeer. Debe respetar con respeto. Tuvimos que integrar con un servicio SOAP/MTOM/XOM, por lo que XML usa archivos adjuntos binarios. No tenía mucha idea sobre esa especificación (empresa hinchada). Usando XML::Compile::SOAP, lo pusimos a funcionar en tres horas, donde la mayor parte del tiempo se desperdiciaba con problemas triviales que solo tenían que ver con nuestro (absurdo) enfoque de prueba y error. Si hubiéramos seguido a los documentos, habría sido una hora.

Así que recomiendo encarecidamente XML::Compile::SOAP de Mark Overmeer. Nos ha funcionado mucho.

Cuestiones relacionadas