Почему мое приложение Java / SalesForce не может создать JAXBContext из-за ограничений безопасности? - PullRequest
1 голос
/ 23 января 2011

Я был на одном учебном пособии по Java / Salesforce , но я не мог заставить его работать как есть, потому что SoapBindingStub кажется устаревшим кодом, основанным на устаревших библиотеках.Поэтому я попытался объединить код с кодом JAX-WS Quick Start , но это тоже не сработало.Что бы я ни делал, в конечном итоге образец консольного приложения будет страдать от исключений, жалуясь на « Исключение веб-службы при создании порта salesface. Невозможно создать JAXBContext из-за ограничения безопасности для класса javax.xml.ws.WebServiceException ».

Я отказался (на данный момент) от попытки смешать два кода, и вместо этого сейчас просто работаю над абстрагированием 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: 

Последняя строка (в хронологическом порядке) в стеке, которая ссылается на мой собственный код:

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

Операторы System.out.println в источнике подтверждают, что именно это выполнение завершается.В этой строке конкретно указывается:

Soap soap = (sforceService).getSoap();

Кто-нибудь знает, как или почему это может выйти за пределы ограничения безопасности, в конечном итоге оставляя Java неспособным создать JAXBContext?

Ответы [ 3 ]

1 голос
/ 24 января 2011

Наконец-то у меня работает логин ... как для первого урока, над которым я работал, так и для кода, созданного из 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 голосов
/ 23 января 2011

Если вы хотите использовать Jax-WS, посмотрите Jax-WS / salesforce , есть длинный список примеров java для salesfoce в вики

0 голосов
/ 23 января 2011

Похоже, вы пытаетесь создать веб-службу, у которой в контракте есть подкласс java.lang.Exception или StackTraceElement.Вы не можете сделать это.Единственный способ обработки исключений - использовать ошибки.

Вы выполнили всю эту работу за пределами 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...