2016-03-01 2 views
0

Я надеюсь, что вы можете мне помочь.JAX-WS SOA Client Authentication

Я пытаюсь создать клиент Java SOAP с использованием JAX-WS.

я импортировал все функции веб-службы с использованием wsimport, для этого я должен был поставить файл аутентификации, используя -Xauthfile, файл аутентификации содержал следующее:

http://username:[email protected]:80/Windchill/servlet/MathService?wsdl

я импортировал все из классов на затмение, и я пытаюсь вызвать MathService добавить функцию, используя следующий код:

import javax.xml.ws.BindingProvider; 
import com.ptc.jws.service.org.myorg.mathservice.MathServiceImpl; 
import com.ptc.jws.service.org.myorg.mathservice.MathServiceImplService; 

public class ClientStart { 

public static void main(String[] args) throws Exception { 

MathServiceImplService service = new MathServiceImplService(); 
MathServiceImpl port = service.getMathServiceImplPort(); 

// Configure service endpoint (override defined one of the WSDL) 
BindingProvider binding = (BindingProvider) port; 
binding.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://server.com/Windchill/servlet/MathService"); 


// Add HTTP Basic Authentification credentials to this request  
binding.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "username"); 
binding.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password"); 
port.add(1, 1); 

} 

} 

Я попытался с/без перекрывая конечную точку службы

Когда я запускаю код, я получаю следующее сообщение об ошибке:

Exception in thread "main" javax.xml.ws.WebServiceException: Failed to access the WSDL at: http://server.com/Windchill/servlet/MathService?wsdl. It failed with: 
Got Server returned HTTP response code: 401 for URL: http://server.com/Windchill/servlet/MathService?wsdl while opening stream from http://server.com/Windchill/servlet/MathService?wsdl. 

Я также получаю эту ошибку:

WARNING: WSP0075: Policy assertion "{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}EncryptedParts" was evaluated as "UNKNOWN". 
Mar 01, 2016 4:29:13 PM  [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives 

Файл MathServiceImpl.java выглядит следующим образом:

import java.net.MalformedURLException; 
import java.net.URL; 
import javax.xml.namespace.QName; 
import javax.xml.ws.Service; 
import javax.xml.ws.WebEndpoint; 
import javax.xml.ws.WebServiceClient; 
import javax.xml.ws.WebServiceException; 
import javax.xml.ws.WebServiceFeature; 


/** 
* This class was generated by the JAX-WS RI. 
* JAX-WS RI 2.2.4-b01 
* Generated source version: 2.2 
* 
*/ 
@WebServiceClient(name = "MathServiceImplService", targetNamespace = "http://MathService.myorg.org.service.jws.ptc.com/", wsdlLocation = "http://server.com/Windchill/servlet/MathService?wsdl") 
public class MathServiceImplService extends Service 
{ 

private final static URL MATHSERVICEIMPLSERVICE_WSDL_LOCATION; 
private final static WebServiceException MATHSERVICEIMPLSERVICE_EXCEPTION; 
private final static QName MATHSERVICEIMPLSERVICE_QNAME = new QName("http://MathService.myorg.org.service.jws.ptc.com/", "MathServiceImplService"); 

static { 
    URL url = null; 
    WebServiceException e = null; 
    try { 
     url = new URL("http://server.com/Windchill/servlet/MathService?wsdl"); 
    } catch (MalformedURLException ex) { 
     e = new WebServiceException(ex); 
    } 
    MATHSERVICEIMPLSERVICE_WSDL_LOCATION = url; 
    MATHSERVICEIMPLSERVICE_EXCEPTION = e; 
} 

public MathServiceImplService() { 
    super(__getWsdlLocation(), MATHSERVICEIMPLSERVICE_QNAME); 
} 

public MathServiceImplService(WebServiceFeature... features) { 
    super(__getWsdlLocation(), MATHSERVICEIMPLSERVICE_QNAME, features); 
} 

public MathServiceImplService(URL wsdlLocation) { 
    super(wsdlLocation, MATHSERVICEIMPLSERVICE_QNAME); 
} 

public MathServiceImplService(URL wsdlLocation, WebServiceFeature... features) { 
    super(wsdlLocation, MATHSERVICEIMPLSERVICE_QNAME, features); 
} 

public MathServiceImplService(URL wsdlLocation, QName serviceName) { 
    super(wsdlLocation, serviceName); 
} 

public MathServiceImplService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) { 
    super(wsdlLocation, serviceName, features); 
} 

/** 
* 
* @return 
*  returns MathServiceImpl 
*/ 
@WebEndpoint(name = "MathServiceImplPort") 
public MathServiceImpl getMathServiceImplPort() { 
    return super.getPort(new QName("http://MathService.myorg.org.service.jws.ptc.com/", "MathServiceImplPort"), MathServiceImpl.class); 
} 

/** 
* 
* @param features 
*  A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values. 
* @return 
*  returns MathServiceImpl 
*/ 
@WebEndpoint(name = "MathServiceImplPort") 
public MathServiceImpl getMathServiceImplPort(WebServiceFeature... features) { 
    return super.getPort(new QName("http://MathService.myorg.org.service.jws.ptc.com/", "MathServiceImplPort"), MathServiceImpl.class, features); 
} 

private static URL __getWsdlLocation() { 
    if (MATHSERVICEIMPLSERVICE_EXCEPTION!= null) { 
     throw MATHSERVICEIMPLSERVICE_EXCEPTION; 
    } 
    return MATHSERVICEIMPLSERVICE_WSDL_LOCATION; 
} 

} 

Любая помощь будет принята с благодарностью! Спасибо!

Tim

ответ

2

401 ответ HTTP, кажется, выходит из приложения, которое служит само определение WSDL. Я думаю, что лучше всего (когда это возможно) загрузить WSDL и расслоить его в ресурсах приложений.

Тогда вы должны изменить URL в JAX-WS сгенерированного файла (вероятно MathServiceImplService.java) от http://server.com/xxx.wsdl к некоторому URL как

MathServiceImplService.class.getResource("/path/to/wsdl.wsdl"); 
+0

Здравствуйте Раффаэле, Спасибо за ваш ответ. Я очень ценю это. Я загрузил файл wsdl в свой ресурс приложения. Не могли бы вы объяснить, какие части MathServiceImplService.java мне нужно изменить? Я добавил его к исходному вопросу. Большое спасибо. Tim – Cam1989

+0

См. Статический инициализатор, где «новый URL» («http://server.com/Windchill/servlet/MathService?wsdl»); ' – Raffaele

+0

Я изменил это на: 'MATHSERVICEIMPLSERVICE_WSDL_LOCATION = MathServiceImplService.class.getResource (" MathService .wsdl ");» и я все равно получаю ту же ошибку! Я добавил несколько более подробных stacktrace к оригинальному сообщению! – Cam1989