Невозможно создать новые инциденты в Dynamics CRM с Java и Axis2 - PullRequest
2 голосов
/ 14 июня 2010

Итак, я пытался выяснить это, как ни странно, когда я запускал его на одной машине, у меня возникла общая ошибка Axis без описания, но теперь на другой машине я получаю другое сообщение об ошибке, но я 'Я все еще застрял.По сути, я просто пытаюсь сделать то, что, на мой взгляд, было бы довольно тривиальной задачей - создать новый инцидент в Microsoft Dynamics CRM 4.0 с помощью вызова веб-служб.

Я начал с загрузки XML с http://hostname/MSCrmServices/2007/CrmService.asmx и генерирование кода из него с помощью Axis2.В любом случае, вот моя программа, любая помощь будет принята с благодарностью, так как я застрял в ней гораздо дольше, чем я думал, и у меня действительно нет идей здесь.

    public class TestCRM {  

    private static String endpointURL = "http://theHost/MSCrmServices/2007/CrmService.asmx";  
    private static String userName = "myUserNameHere";  
    private static String password = "myPasswordHere";  
    private static String host = "theHostname";  
    private static int port = 80;  
    private static String domain = "theDomain";
    private static String orgName = "theOrganization";

    public static void main(String[] args) {  

        CrmServiceStub stub;  
        try {  
            stub = new CrmServiceStub(endpointURL);  
            setOptions(stub._getServiceClient().getOptions());  

            RetrieveMultipleDocument rmd = RetrieveMultipleDocument.Factory.newInstance();  
            com.microsoft.schemas.crm._2007.webservices.RetrieveMultipleDocument.RetrieveMultiple rm = com.microsoft.schemas.crm._2007.webservices.RetrieveMultipleDocument.RetrieveMultiple.Factory.newInstance();

            QueryExpression query = QueryExpression.Factory.newInstance();  
            query.setColumnSet(AllColumns.Factory.newInstance());  
            query.setEntityName(EntityName.INCIDENT.toString());    

            rm.setQuery(query);  
            rmd.setRetrieveMultiple(rm);

            TargetCreateIncident tinc = TargetCreateIncident.Factory.newInstance();
            Incident inc = tinc.addNewIncident();
            inc.setDescription("This is a test of ticket creation through a web services call.");

            CreateDocument cd = CreateDocument.Factory.newInstance();
            Create create = Create.Factory.newInstance();
            create.setEntity(inc);

            cd.setCreate(create);

            Incident test = (Incident)cd.getCreate().getEntity();

            CrmAuthenticationTokenDocument catd = CrmAuthenticationTokenDocument.Factory.newInstance();  
            CrmAuthenticationToken token = CrmAuthenticationToken.Factory.newInstance(); 
            token.setAuthenticationType(0);     
            token.setOrganizationName(orgName);  
            catd.setCrmAuthenticationToken(token);          

            //The two printlns below spit back XML that looks okay to me?
            System.out.println(cd); 
            System.out.println(catd);
            /* stuff that doesn't work */   
            CreateResponseDocument crd = stub.create(cd, catd, null, null); //this line throws the error
            CreateResponse cr = crd.getCreateResponse();
            System.out.println("create result: " + cr.getCreateResult());
            /* End stuff that doesn't work */

            System.out.println();
            System.out.println();
            System.out.println();
            boolean fetchNext = true;  
            while(fetchNext){  
                RetrieveMultipleResponseDocument rmrd = stub.retrieveMultiple(rmd,  catd, null, null);
                //This retrieve using the CRMAuthenticationToken catd works just fine

                RetrieveMultipleResponse rmr = rmrd.getRetrieveMultipleResponse();  
                BusinessEntityCollection bec = rmr.getRetrieveMultipleResult();  

                String pagingCookie = bec.getPagingCookie();  
                fetchNext = bec.getMoreRecords();  

                ArrayOfBusinessEntity aobe = bec.getBusinessEntities();  
                BusinessEntity[] myEntitiesAtLast = aobe.getBusinessEntityArray();  

                for(int i=0; i<myEntitiesAtLast.length; i++){  
                    //cast to whatever you asked for...  
                    Incident myEntity = (Incident) myEntitiesAtLast[i];  
                    System.out.println("["+(i+1)+"]: " + myEntity);
                }  
            }  
        }   
        catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

    private static void setOptions(Options options){  
        HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();  

        List authSchemes = new ArrayList();  
        authSchemes.add(HttpTransportProperties.Authenticator.NTLM);   
        auth.setAuthSchemes(authSchemes);   

        auth.setUsername(userName);
        auth.setPassword(password);  
        auth.setHost(host);  
        auth.setPort(port);  
        auth.setDomain(domain);  
        auth.setPreemptiveAuthentication(false);  
        options.setProperty(HTTPConstants.AUTHENTICATE, auth);  
        options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, "true");  
    }
}

Кроме того, вот сообщение об ошибке, которое я получаю:

org.apache.axis2.AxisFault: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'S' (code 83) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1]
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:123)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:67)
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:354)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
    at com.spanlink.crm.dynamics4.webservice.CrmServiceStub.create(CrmServiceStub.java:618)
    at com.spanlink.crm.dynamics4.runtime.TestCRM.main(TestCRM.java:82)
Caused by: org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'S' (code 83) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1]
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:260)
    at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.getSOAPEnvelope(StAXSOAPModelBuilder.java:161)
    at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.<init>(StAXSOAPModelBuilder.java:110)
    at org.apache.axis2.builder.BuilderUtil.getSOAPBuilder(BuilderUtil.java:682)
    at org.apache.axis2.transport.TransportUtils.createDocumentElement(TransportUtils.java:215)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:145)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:108)
    ... 7 more
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'S' (code 83) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1]
    at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:623)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2047)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)
    at javax.xml.stream.util.StreamReaderDelegate.next(StreamReaderDelegate.java:60)
    at org.apache.axiom.om.impl.builder.SafeXMLStreamReader.next(SafeXMLStreamReader.java:183)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:597)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:172)
    ... 13 more

Редактировать: Ах, я думаю, что, возможно, я кое о чем.Я использовал wireshark, чтобы увидеть, что происходит, и похоже, что «S» - это ответ сервера.Обнюхивая трафик, похоже, что проблема в том, что «серверу не удалось обработать запрос. ---> Исключение было вызвано целью вызова. ---> Необходимо указать родительский контакт или учетную запись. \ R \n "

Я оставлю это без ответа на данный момент, потому что у меня технически это еще не работает, но, по крайней мере, я знаю, что происходит сейчас.

Ответы [ 2 ]

0 голосов
/ 18 июня 2010

Я рад, что у вас это работает. Когда CRM генерирует исключения, первое, что нужно проверить, это журналы трассировки CRM. CRM дает довольно хорошее описание того, что пошло не так. Это помогает значительно сузить ваше расследование.

Дополнительная информация о включении трассировки на сервере: http://support.microsoft.com/kb/907490

0 голосов
/ 14 июня 2010

Я смог заставить его работать, просто нужно было добавить родительский аккаунт.

...