为什么可以';由于安全限制,我的Java/SalesForce应用程序是否创建JAXBContext?

为什么可以';由于安全限制,我的Java/SalesForce应用程序是否创建JAXBContext?,java,web-services,soap,jaxb,salesforce,Java,Web Services,Soap,Jaxb,Salesforce,我使用了一个,但我无法让它按原样工作,因为SoapBindingStub似乎是基于折旧库的过时代码。因此,我尝试将代码与源代码进行网格化,但这也不太管用。不管我做了什么,最终示例控制台应用程序都会遇到异常,抱怨“Web服务异常创建salesface端口:由于类javax.xml.ws.WebServiceException的安全限制,无法创建JAXBContext” 我(暂时)放弃了将这两个代码混搭在一起的尝试,而是现在正在抽象JAX-WS Quickstart.java,这样我就可以理解它的工

我使用了一个,但我无法让它按原样工作,因为SoapBindingStub似乎是基于折旧库的过时代码。因此,我尝试将代码与源代码进行网格化,但这也不太管用。不管我做了什么,最终示例控制台应用程序都会遇到异常,抱怨“Web服务异常创建salesface端口:由于类javax.xml.ws.WebServiceException的安全限制,无法创建JAXBContext

我(暂时)放弃了将这两个代码混搭在一起的尝试,而是现在正在抽象JAX-WS Quickstart.java,这样我就可以理解它的工作原理,并在其他应用程序中重用它的方法

无论我如何分割代码,它总是被卡在同一个位置上,并产生本质上相同的错误

以下是持续失败的方法的当前代码:

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: 
源代码中的System.out.println语句确认这是执行终止的内容。这一行特别指出:

Soap soap = (sforceService).getSoap();

有人知道这如何或为什么会超越安全限制,最终导致java无法创建JAXBContext吗?

看起来您正在尝试创建一个web服务,该服务的合同中包含一个子类
java.lang.Exception
StackTraceeElement
。你不能那样做。处理异常的唯一方法是使用故障

您是否在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;
    }

看起来您正在尝试创建一个web服务,该服务的合同中包含一个子类
java.lang.Exception
StackTraceeElement
。你不能那样做。处理异常的唯一方法是使用故障

您是否在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;
    }

如果您想使用Jax WS,请参阅,有一长串的

如果您想使用Jax WS,请参阅,有一长串的

我终于可以登录了。。。在第一个教程中,我使用了从JAX-WS-Quickstart派生的拼接代码。如果它对任何人都有帮助,下面是我完整的LoginToolkit类。(对不起,当我的时间或产出得不到报酬时,我有点懒于发表评论。)

/**
* 
*/
包hu.flux.salesforce;
导入java.net.URL;
导入java.util.Collections;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBException;
导入javax.xml.namespace.QName;
导入javax.xml.ws.BindingProvider;
导入javax.xml.ws.WebServiceException;
导入javax.xml.ws.handler.MessageContext;
导入hu.flux.exceptions.ExceptionToolkit;
导入hu.flux.input.PromptUser;
导入com.sforce.soap.enterprise.invaliddfault;
导入com.sforce.soap.enterprise.LoginResult;
导入com.sforce.soap.enterprise.SessionHeader;
导入com.sforce.soap.enterprise.SforceService;
导入com.sforce.soap.enterprise.soap;
导入com.sun.xml.bind.api.JAXBRIContext;
导入com.sun.xml.ws.api.message.Headers;
导入com.sun.xml.ws.developer.WSBindingProvider;
/**
*@作者布莱恩·凯斯勒
*
*/
公共类登录工具包{
私有Soap绑定=null;
private LoginResult LoginResult=null;;
public void setBinding(Soap绑定){this.binding=binding;}
公共Soap getBinding(){return binding;}
public void setLoginResult(LoginResult LoginResult){this.LoginResult=LoginResult;}
public LoginResult getLoginResult(){return LoginResult;}
/**
* 
*/
公共登录工具包(){doLogin();}
私有布尔多洛金()
{   
//字符串userName=getUserInput(“输入用户名:”).trim();
//字符串密码=getUserInput(“输入密码:”).trim();
字符串用户名=“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”;
字符串密码=“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”;
binding=bindEnterpriseWSDL();
System.out.println(“立即登录…”);
请尝试{loginResult=binding.login(用户名、密码);}
catch(invaliddfault invaliddfault){return loginExceptionCaught(“无效id错误”,invaliddfault);}
catch(com.sforce.soap.enterprise.LoginFault LoginFault){return loginExceptionCaught(“登录错误”,LoginFault);}
catch(com.sforce.soap.enterprise.UnexpectedErrorFault UnexpectedErrorFault){return loginExceptionCaught(“意外错误错误”,UnexpectedErrorFault);}
//检查密码是否已过期
return(loginResult.isPasswordExpired())?passwordExpired():bindSession();
}
私有Soap bindEnterpriseWSDL()
{
尝试
{
URL wsdlLocation=this.getClass().getClassLoader().getResource(“META-INF/enterprise.wsdl”);
if(wsdlLocation==null)
{
WebServiceException WebServiceException=新的WebServiceException(“未找到enterprise.wsdl!”);
ExceptionToolkit.display(“Web服务异常找不到enterprise.wsdl.”,webServiceException);
抛出新的WebServiceException(WebServiceException);
}
else{System.out.println(“\n\n\nenterprise.wsdl已找到!\n\n\n”);}
QName QName=新的QName(“urn:enterprise.soap.sforce.com”,“sforce服务”);
SforceService SforceService=新建
/**
 * 
 */
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) {}

}