java - 为什么由于安全限制,我的 Java/SalesForce 应用程序无法创建 JAXBContext?

标签 java web-services soap jaxb salesforce

我在一个 Java/Salesforce tutorial但我无法让它按原样工作,因为 SoapBindingStub 似乎是基于已折旧库的过时代码。所以我尝试将代码与 JAX-WS Quick Start 中的代码相匹配。 ,但这也不太有效。无论我做什么,最终示例控制台应用程序都会遇到异常,并提示“创建 salesface 端口时出现 Web 服务异常。:由于类 javax.xml.ws.WebServiceException 的安全限制,无法创建 JAXBContext”。

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

无论我如何对代码进行切片和切 block ,它总是会卡在同一位置,并出现本质上相同的错误。

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

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 语句确认这就是执行终止的原因。该行具体指出:

Soap soap = (sforceService).getSoap();

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

最佳答案

我终于可以登录了...无论是我参与的第一个教程还是从 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) {}

}

关于java - 为什么由于安全限制,我的 Java/SalesForce 应用程序无法创建 JAXBContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771404/

相关文章:

Java 应用程序 : repaint isn't executed in While Loop?

python - 将 POST 请求限制为 Pyramid 上的最大大小

web-services - Coldfusion RESTful 网络服务 : Object is not an instance of declaring class

java - 获取每个 executorservice 线程背后的查询

java - 了解 Optional<T>.map()

Java:扫描仪初学者

java - 您如何在 JavaServer Faces 中执行分页列表?

java - Web服务命名空间共享

复杂类型的 PHP SoapParam/SoapVar 给出 "object hasn' t 'xxx' 属性”- 重复元素

python - 带有时间戳标记的 UsernameToken || python || WS-安全性 (WSSE)