2011-01-22 24 views
1

我在一個Java/Salesforce tutorial,但我無法讓它工作,因爲SoapBindingStub似乎是基於折舊庫的過時代碼。所以我嘗試使用JAX-WS Quick Start的代碼對代碼進行網格劃分,但是這也沒有起作用。無論我做了什麼,示例控制檯應用程序最終都會遭遇異常,抱怨「Web服務異常創建salesface端口:由於類javax.xml.ws.WebServiceException的安全性限制,無法創建JAXBContext」。我放棄了(暫時)試圖混淆這兩個代碼,而是現在只是在抽象JAX-WS Quickstart.java,以便我能理解它的工作原理,並在其他應用程序中重用其方法。爲什麼我的Java/SalesForce應用程序由於安全限制而無法創建JAXBContext?

無論我如何切片和切塊代碼,它總是被卡在相同的位置,基本上有相同的錯誤。

這裏是方法的當前代碼其persistantly失敗:

private void initPort() 
{ 
    try 
    { 
     URL wsdlLocation = this.getClass().getClassLoader().getResource("META-INF/enterprise.wsdl"); 
     if (wsdlLocation == null) 
     { 
      WebServiceException webServiceException = new WebServiceException("enterprise.wsdl not found!"); 
      ExceptionToolkit.display("Web Service Exception can't find enterprise.wsdl", webServiceException); 
      throw webServiceException; 
     } 
     else {System.out.println("\nFOUND enterprise.wsdl!!!\n\n");} 

     QName qName = new QName("urn:enterprise.soap.sforce.com", "SforceService"); 
     SforceService sforceService = new SforceService(wsdlLocation, qName); 
     System.out.println("\nsforceService INITIALIZED. About to get Soap.\n\n"); 
     Soap soap = (sforceService).getSoap(); 
     System.out.println("\nWe have soap.\n\n"); 
     setPort (soap); 
    } 
    catch (WebServiceException webServiceException) 
    { 
     ExceptionToolkit.display("Web Service Exception creating salesface port", webServiceException); 
     return; 
    } 
} 

以下是錯誤,立即之前和之後,包括輸出:在

Running main loop 



FOUND enterprise.wsdl!!! 



sforceService INITIALIZED. About to get Soap. 




Web Service Exception creating salesface port: Unable to create JAXBContext due to the security restriction 
on class javax.xml.ws.WebServiceException 
javax.xml.ws.WebServiceException: Unable to create JAXBContext due to the security restriction 
    at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:131) 
    at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:63) 
    at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:224) 
    at com.sun.xml.ws.client.WSServiceDelegate.addSEI(WSServiceDelegate.java:588) 
    at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:291) 
    at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:274) 
    at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:267) 
    at javax.xml.ws.Service.getPort(Unknown Source) 
    at com.sforce.soap.enterprise.SforceService.getSoap(SforceService.java:53) 
    at hu.flux.salesforce.LoginToolkit.initPort(LoginToolkit.java:78) 
    at hu.flux.salesforce.LoginToolkit.doLogin(LoginToolkit.java:122) 
    at hu.flux.salesforce.LoginToolkit.<init>(LoginToolkit.java:49) 
    at hu.flux.salesforce.samples.Quickstart.mainLoop(Quickstart.java:55) 
    at hu.flux.salesforce.samples.Quickstart.<init>(Quickstart.java:28) 
    at hu.flux.salesforce.samples.Quickstart.main(Quickstart.java:21) 
Caused by: java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
java.lang.StackTraceElement does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at java.lang.StackTraceElement 
     at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace() 
     at java.lang.Throwable 
     at java.lang.Exception 
     at com.sforce.ws.ConnectionException 
     at com.sforce.ws.SoapFaultException 
     at com.sforce.soap.enterprise.fault.ApiFault 
     at public javax.xml.bind.JAXBElement com.sforce.soap.enterprise.fault.ObjectFactory.createFault(com.sforce.soap.enterprise.fault.ApiFault) 
     at com.sforce.soap.enterprise.fault.ObjectFactory 
com.sforce.ws.types.Time does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at com.sforce.ws.types.Time 
     at public com.sforce.ws.types.Time com.sforce.soap.enterprise.sobject.BusinessHours.getFridayEndTime() 
     at com.sforce.soap.enterprise.sobject.BusinessHours 
     at public com.sforce.soap.enterprise.sobject.BusinessHours com.sforce.soap.enterprise.sobject.ObjectFactory.createBusinessHours() 
     at com.sforce.soap.enterprise.sobject.ObjectFactory 

    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:124) 
    ... 14 more 
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
java.lang.StackTraceElement does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at java.lang.StackTraceElement 
     at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace() 
     at java.lang.Throwable 
     at java.lang.Exception 
     at com.sforce.ws.ConnectionException 
     at com.sforce.ws.SoapFaultException 
     at com.sforce.soap.enterprise.fault.ApiFault 
     at public javax.xml.bind.JAXBElement com.sforce.soap.enterprise.fault.ObjectFactory.createFault(com.sforce.soap.enterprise.fault.ApiFault) 
     at com.sforce.soap.enterprise.fault.ObjectFactory 
com.sforce.ws.types.Time does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at com.sforce.ws.types.Time 
     at public com.sforce.ws.types.Time com.sforce.soap.enterprise.sobject.BusinessHours.getFridayEndTime() 
     at com.sforce.soap.enterprise.sobject.BusinessHours 
     at public com.sforce.soap.enterprise.sobject.BusinessHours com.sforce.soap.enterprise.sobject.ObjectFactory.createBusinessHours() 
     at com.sforce.soap.enterprise.sobject.ObjectFactory 

    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:66) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:422) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:270) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:103) 
    at com.sun.xml.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:89) 
    at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:126) 
    at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:125) 
    ... 16 more 



1. Login 
2. Get Accounts 
3. Update Accounts 
4. Get Server Timestamp 
5. Exit 
Enter a menu option: 

最後一行(按時間順序)這是指我自己的代碼是:

at hu.flux.salesforce.LoginToolkit.initPort(LoginToolkit.java:78) 

System.out.println stat源代碼中的元素確認這是執行終止的內容。該行特別指出:

Soap soap = (sforceService).getSoap(); 

有誰知道如何或爲何這可能超越安全限制最終放棄Java無法創建的JAXBContext?

+0

Downvoting一個合法的問題...非常有幫助。 : -/ – 2011-01-23 12:24:49

回答

1

名單終於有了登錄工作......對於我第一次參加的教程以及從JAX WS Quickstart派生的代碼拼接而言。如果它幫助任何人,這裏是我完整的LoginToolkit類。 (對不起,當我沒有得到我的時間或輸出的報酬時,我有點懶惰)。

/** 
* 
*/ 
package hu.flux.salesforce; 

import java.net.URL; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.namespace.QName; 
import javax.xml.ws.BindingProvider; 
import javax.xml.ws.WebServiceException; 
import javax.xml.ws.handler.MessageContext; 

import hu.flux.exceptions.ExceptionToolkit; 
import hu.flux.input.PromptUser; 

import com.sforce.soap.enterprise.InvalidIdFault; 
import com.sforce.soap.enterprise.LoginResult; 
import com.sforce.soap.enterprise.SessionHeader; 
import com.sforce.soap.enterprise.SforceService; 
import com.sforce.soap.enterprise.Soap; 
import com.sun.xml.bind.api.JAXBRIContext; 
import com.sun.xml.ws.api.message.Headers; 
import com.sun.xml.ws.developer.WSBindingProvider; 

/** 
* @author Brian Kessler 
* 
*/ 
public class LoginToolkit { 

    private Soap binding = null; 
    private LoginResult loginResult = null;; 

    public void setBinding(Soap binding) { this.binding = binding; } 
    public Soap getBinding() { return binding; } 

    public void setLoginResult(LoginResult loginResult) { this.loginResult = loginResult; } 
    public LoginResult getLoginResult() { return loginResult; } 

    /** 
    * 
    */ 
    public LoginToolkit() { doLogin(); } 

    private boolean doLogin() 
    { 
     //String userName = getUserInput("Enter user name: ").trim(); 
     //String password = getUserInput("Enter password: ").trim(); 
     String userName = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
     String password = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
     binding = bindEnterpriseWSDL(); 

     System.out.println("LOGGING IN NOW...."); 
     try { loginResult = binding.login (userName, password); } 
     catch (InvalidIdFault invalidIdFault) { return loginExceptionCaught("invalid id fault", invalidIdFault); } 
     catch (com.sforce.soap.enterprise.LoginFault loginFault) { return loginExceptionCaught("login fault", loginFault); } 
     catch (com.sforce.soap.enterprise.UnexpectedErrorFault unexpectedErrorFault) { return loginExceptionCaught("unexpected error fault", unexpectedErrorFault); } 

     // Check if the password has expired 
     return (loginResult.isPasswordExpired()) ? passwordExpired() : bindSession(); 
    } 

    private Soap bindEnterpriseWSDL() 
    { 
     try 
     { 
      URL wsdlLocation = this.getClass().getClassLoader().getResource("META-INF/enterprise.wsdl"); 
      if (wsdlLocation == null) 
      { 
       WebServiceException webServiceException = new WebServiceException("enterprise.wsdl not found!"); 
       ExceptionToolkit.display ("Web Service Exception could not find enterprise.wsdl.", webServiceException); 
       throw new WebServiceException(webServiceException); 
      } 
      else { System.out.println ("\n\n\nenterprise.wsdl WAS found!\n\n\n");} 

      QName qName = new QName("urn:enterprise.soap.sforce.com", "SforceService"); 
      SforceService sforceService = new SforceService(wsdlLocation, qName); 
      Soap soap = sforceService.getSoap(); 
      return soap; 
     } 
     catch (WebServiceException webServiceException) 
     { 
      ExceptionToolkit.display ("Web Service Exception creating salesface port.", webServiceException); 
      throw new WebServiceException(webServiceException); 
     } 
    } 


    private WSBindingProvider enableGzip(BindingProvider bindingProvider) 
    { 
     //Enable GZip compression 
     Map<String, List<String>> httpHeaders = new HashMap<String, List<String>>(); 
     httpHeaders.put("Content-Encoding", Collections.singletonList("gzip")); 
     httpHeaders.put("Accept-Encoding", Collections.singletonList("gzip")); 
     Map<String, Object> reqContext = bindingProvider.getRequestContext(); 
     reqContext.put(MessageContext.HTTP_REQUEST_HEADERS, httpHeaders); 
     return (WSBindingProvider) bindingProvider; 
    } 

    private boolean passwordExpired() 
    { 
     System.out.println("An error has occured. Your password has expired."); 
     return false; 
    } 

    private boolean bindSession() 
    { 
     //binding._setProperty(Soap BindingStub.ENDPOINT_ADDRESS_PROPERTY, loginResult.getServerUrl()); 
     WSBindingProvider bindingProvider = ((WSBindingProvider) binding); 
     bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, loginResult.getServerUrl()); 
     bindingProvider = enableGzip (bindingProvider); 

     // Create a new session header object and add the session id from the login return object 
     SessionHeader sessionHeader = new SessionHeader(); 
     sessionHeader.setSessionId(loginResult.getSessionId()); 
     bindingProvider = setJAXBContext (bindingProvider, sessionHeader); 


     reportLoginSuccess(); 

     return true; // return true to indicate that we are logged in, pointed at the right url and have our security token in place. 
    } 

    private WSBindingProvider setJAXBContext (WSBindingProvider bindingProvider, SessionHeader sessionHeader) 
    { 
     JAXBContext jc; 
     try { jc = JAXBContext.newInstance("com.sforce.soap.enterprise"); } 
     catch (JAXBException jaxbException) 
     { 
      ExceptionToolkit.display ("Error creating JAXBContext instance.", jaxbException); 
      throw new WebServiceException(jaxbException); 
     } 

     bindingProvider.setOutboundHeaders(Headers.create((JAXBRIContext) jc, sessionHeader)); 
     return bindingProvider; 
    } 

    private void reportLoginSuccess() 
    { 
     System.out.println("Login was successfull."); 
     System.out.print("The returned session id is: "); 
     System.out.println(getLoginResult().getSessionId()); 
     System.out.print("Your logged in user id is: "); 
     System.out.println(getLoginResult().getUserId() + " \n\n"); 
    } 

    private boolean loginExceptionCaught(String label, Exception exception) 
    { 
     ExceptionToolkit.display ("A " + label + " has occured.", exception); 
     return false; 
    } 

    public boolean checkLogin() 
    { 
     // check to see if we are already logged in 
     if (this.getLoginResult() == null) 
     { 
      System.out.println("Run the login sample before the others.\n"); 
      PromptUser.getUserInput("Hit enter to continue: "); 
      System.out.println("\n"); 
      return false; 
     } 
     return true; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) {} 

} 
0

看起來您正在嘗試製作一個Web服務,該服務的合同中包含java.lang.ExceptionStackTraceElement的子類。你不能那樣做。處理異常的唯一方法是使用錯誤。

您是否在salesforce之外完成了所有這些工作?

請注意,您的代碼不便於手動初始化JAXB上下文,但是您沒有將它傳遞到JAX-WS調用中,因此堆棧正在創建新的JAXB上下文並嘗試進入問題。你記得它傳遞到綁定提供者,如...

try { 
     jc = JAXBContext.newInstance("com.salesforce.sei"); 
     bindingProvider.setOutboundHeaders(Headers.create((JAXBRIContext) jc, sh)); 
    } catch (JAXBException e) { 
     System.out.println("Error creating JAXBContext instance " + e.getMessage()); 
     return false; 
    } 
+0

我在這段代碼中沒有使用任何子類。我正在研究的教程都是關於使用Java與SalesForce,所以我不知道如何才能明智地將銷售人員排除在外。 – 2011-01-23 00:45:47

+0

順便說一句,我認爲異常處理得很好,我只是不清楚爲什麼我得到這個特定的時候,因爲似乎有訪問WSDL或創建SOAP對象的某種限制。 – 2011-01-23 00:53:34

相關問題