2009-07-12 58 views
8

是否有任何在线资源显示使用Java编写的客户端访问Microsoft CRM内部部署Web服务的基本步骤?使用Java连接到Microsoft Dynamics CRM内部部署的Web服务?

我应该使用哪个Web服务工具包?

我尝试过使用JAXB,但是WSDL元素命名中存在冲突,需要类定制。如果我找到正确的绑定修复,我会在这里发布。

+0

你实现小姐Dynamics CRM中,如果是的话,让你指导我实现一样。寻找你的回应。 – 2012-11-29 10:24:43

+0

@SenthilMg我们没有使用过WCF客户端和简单的基于文件的消息交换。请参阅下面的提示可以使用Axis 2。 – mjn 2012-11-29 13:56:21

回答

8

预置版本上的Microsoft Dynamics CRM应用程序使用Active Directory身份验证。 尽管我从未尝试过从Java引用Microsoft Dynamics CRM Web服务,但我确信它是可行的,因为这些标准Web服务可以通过SOAP从Java引用,就像任何其他Web服务一样。

public class TestCRM { 

private static String endpointURL = "http://server:port/MSCrmServices/2007/CrmService.asmx"; 
private static String userName = "username"; 
private static String password = "password"; 
private static String host = "server"; 
private static int portport = port; 

//To make sure you are using the correct domain open ie and try to reach the service. The same domain you entered there is needed here 
private static String domain = "DOMAIN"; 

private static String orgName = "THIS_IS_REQUIRED"; //this does the work.... 


public static void main(String[] args) { 

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

     RetrieveMultipleDocument rmd = RetrieveMultipleDocument.Factory.newInstance(); 
     RetrieveMultiple rm = RetrieveMultiple.Factory.newInstance(); 

     QueryExpression query = QueryExpression.Factory.newInstance(); 
     query.setColumnSet(AllColumns.Factory.newInstance()); 
     query.setEntityName(EntityName.######.toString()); 
     //query.setFilter... 

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

     //Now this is required. Without it all i got was 401s errors 
     CrmAuthenticationTokenDocument catd = CrmAuthenticationTokenDocument.Factory.newInstance(); 
     CrmAuthenticationToken token = CrmAuthenticationToken.Factory.newInstance(); 
     token.setAuthenticationType(0);  
     token.setOrganizationName(orgName); 
     catd.setCrmAuthenticationToken(token); 

     boolean fetchNext = true; 
     while(fetchNext){ 
      RetrieveMultipleResponseDocument rmrd = stub.RetrieveMultiple(rmd, catd, null, null); 
      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... 
       ### myEntity = (###) myEntitiesAtLast[i]; 
      } 
     } 
    } 
    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); //it doesnt matter... 
    options.setProperty(HTTPConstants.AUTHENTICATE, auth); 
    options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, "true"); //i think this is good.. not required though 
} 
1

存根已使用Apache Axis2框架创建。

0

你可以在这里找到资源。您甚至可以在Dynamics CRM SDK中使用一个示例。正如Manuel Freiholz所说,你必须使用Axis2。

https://msdn.microsoft.com/en-us/library/jj602979(v=crm.5).aspx

http://blogs.msdn.com/b/dynamics-coe/archive/2013/09/21/integrating-microsoft-dynamics-crm-2011-online-with-java-and-other-non-net-clients.aspx

或者,您也可以通过动态提供的OData的接口使用RESTful Web服务(https://msdn.microsoft.com/en-us/library/gg334279.aspx