我在URL https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl上有一个WSDL文件。这是可公开访问的,但是我必须使用VPN,当尝试使用VPN访问URL时,我需要使用我的VPN凭据进行身份验证。我知道这可能很奇怪,只是知道,虽然你可能能够访问这个没有身份验证,我确实需要身份验证。我使用wsimport
从WSDL文件生成java类。在通过xAuthfile
参数提供身份验证文件后,我成功地做到了这一点:
我pom.xml:
<plugin>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<wsdlUrls>
<wsdlUrl>https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl</wsdlUrl>
</wsdlUrls>
<xauthFile>src/main/resources/myauthfile.auth</xauthFile>
<keep>true</keep>
<extension>true</extension>
<sourceDestDir>src/main/java/</sourceDestDir>
<vmArgs>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
</configuration>
</plugin>
生成以下命令:
jaxws:wsimport args: [-keep, -s, 'C:mypathsrcmainjava', -d, 'C:mypathtargetclasses', -encoding, UTF-8, -extension, -Xnocompile, -Xauthfile, 'C:mypathsrcmainresourcesmyauthfile.auth', "https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl"]
myauthfile。auth(包含我的vpn凭据):
https://akooeusername:password@signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl
除了其他类,这产生了这个webservice类:
@WebServiceClient(name = "PrimeSignWorkflowService", targetNamespace = "http://primesign.at/workflow/v1", wsdlLocation = "https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl")
public class PrimeSignWorkflowService
extends Service
{
private final static URL PRIMESIGNWORKFLOWSERVICE_WSDL_LOCATION;
private final static WebServiceException PRIMESIGNWORKFLOWSERVICE_EXCEPTION;
private final static QName PRIMESIGNWORKFLOWSERVICE_QNAME = new QName("http://primesign.at/workflow/v1", "PrimeSignWorkflowService");
static {
URL url = null;
WebServiceException e = null;
try {
url = new URL("https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl");
} catch (MalformedURLException ex) {
e = new WebServiceException(ex);
}
PRIMESIGNWORKFLOWSERVICE_WSDL_LOCATION = url;
PRIMESIGNWORKFLOWSERVICE_EXCEPTION = e;
}
public PrimeSignWorkflowService() {
super(__getWsdlLocation(), PRIMESIGNWORKFLOWSERVICE_QNAME);
}
.....
看起来不错。然而,当我尝试构建我的项目时,我得到错误:
Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: Problem parsing 'https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl'.: java.io.IOException: Server returned HTTP response code: 401 for URL: https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl
正如您所看到的,尽管我能够通过使用我的authfile进行身份验证来从URL生成web服务,但生成的web服务并没有自动使用相同的身份验证,因此它不能访问URL。
如何解决这个问题?我能以某种方式向生成的webservice类添加代码,使其自动进行身份验证吗?
您使用的任何JAX-WS实现都应该有一种为SOAP调用设置代理身份验证的方法。查看文档
如果这也适用于WSDL检索,您将不得不看到。
如果没有,我猜您可以查看一下项目中JAX-WS实现的源代码,看看URL在哪里被使用,以及您可能有哪些选项来引入身份验证机制,但我也可以建议一个不同的路径:
- 下载WSDL,您可以在网络中访问它并使用它。有一个参数
wsimport
允许您更改位置:-wsdllocation <location>
。
您甚至可以将WSDL打包到JAR中并从那里使用它(可能需要对生成的代码进行一些小的更改以从JAR加载)。例如,请参阅这些帖子的一些详细信息:
- JAX-WS客户端:访问本地WSDL的正确路径是什么?
- 目标是.jar文件中的内部目录——java
- web服务客户端无法找到wsdl