2014-01-28 2 views
0

Я ищу для создания автономного клиента SOAP ExactTarget с использованием CXF.ExactTarget SOAP Client, использующий CXF

Мне удалось создать клиента, используя Metro Glassfish, но из-за будущих соображений поддержки мы хотели бы использовать CXF. Я нашел старый пример и связанный с ним проект, но он слишком стар, чтобы быть полезным.

В настоящее время я пытаюсь понять, как установить обработчик на объект stub/port и передать ему динамическое имя пользователя и пароль. По динамическому я имею в виду: приложение получает имя пользователя и пароль от пользователя во время работы. Вот код, который я в настоящее время для реализации Метро:

PartnerAPI service = new PartnerAPI(); 
Soap stub = service.getSoap();  
Map<String, Object> outProperties = new HashMap<String, Object>();   
Map ctx = ((BindingProvider) stub).getRequestContext(); 

requestContext.put(BindingProvider.USERNAME_PROPERTY, user); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 

List<Handler> chain = new ArrayList<Handler>(); 
chain.add(new SecurityHandler()); 
((BindingProvider) stub).getBinding().setHandlerChain(chain); 

Я пытаюсь повторно использовать первые 4-6 строк для реализации CXF, но я не могу использовать обработчики у меня есть, так как они зависят от com.sun.xml.wss.XWSSProcessor.

ответ

0

Вот код, который делает все:

private static Soap createApiStub() { 
    PartnerAPI service = new PartnerAPI(); 
    Soap stub = service.getSoap();   
    Client client = org.apache.cxf.frontend.ClientProxy.getClient(stub);  

    Map<String, Object> outProps = new HashMap<String, Object>();   
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
    outProps.put(WSHandlerConstants.USER, username);  
    outProps.put(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);   
    // Automatically adds a Base64 encoded message nonce and a created timestamp 
    outProps.put(WSHandlerConstants.ADD_UT_ELEMENTS,WSConstants.NONCE_LN + " " + WSConstants.CREATED_LN);  
    outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new ClientPasswordCallback(username, password)); 
    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
    client.getOutInterceptors().add(wssOut); 

    //Enable GZip compression 
    Map<String, java.util.List<String>> httpHeaders = new HashMap<String, java.util.List<String>>(); 
    httpHeaders.put("Content-Encoding",Collections.singletonList("gzip")); 
    httpHeaders.put("Accept-Encoding",Collections.singletonList("gzip")); 
    Map<String, Object> reqContext = client.getRequestContext(); 
    reqContext.put(MessageContext.HTTP_REQUEST_HEADERS,httpHeaders); 

    return stub; 
} 

А вот реализация обработчика:

public class ClientPasswordCallback implements CallbackHandler { 

    private String username; 
    private String password; 

    public ClientPasswordCallback(String username, String password) { 
     this.username = username; 
     this.password = password; 
    } 

    public void handle(Callback[] callbacks) throws IOException, 
    UnsupportedCallbackException { 
     for (Callback callback: callbacks){ 
      if (callback instanceof WSPasswordCallback){ 
       WSPasswordCallback pc = (WSPasswordCallback) callback;    
       if (username.equals(pc.getIdentifier())) {     
        pc.setPassword(password);     
       } 
      } else if (callback instanceof NameCallback){ 
       throw new UnsupportedCallbackException(callback); 
      } else { 
       throw new UnsupportedCallbackException(callback); 
      }   
     } 
    } 
} 

Это answer помог мне пройти пароль dynamiclly.