我在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:\mypath\src\main\java', -d, 'C:\mypath\target\classes', -encoding, UTF-8, -extension, -Xnocompile, -Xauthfile, 'C:\mypath\src\main\resources\myauthfile.auth', "https://signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl"]
myauthfile.auth(包含我的VPN凭证):
https://akooe\username:password@signatur.ak-ooe.at/primesign/services/workflowMTOM?wsdl
除了其他类别之外,这会产生这个Web服务类别:
@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。
我如何解决这个问题?我可以以某种方式向生成的Web服务类添加代码,以便它自动进行身份验证吗?
1条答案
按热度按时间d4so4syb1#
无论您使用的是什么JAX-WS实现,都应该有一种方法来为SOAP调用设置代理身份验证。
如果这也适用于WSDL检索,则必须查看。
如果没有,我想您可以浏览一下项目中的JAX-WS实现的源代码,看看在哪里使用了该URL,以及您可能有哪些选项来引入身份验证机制,但我也可以建议一种不同的方法:
-wsdllocation <location>
.您甚至可以将WSDL打包到JAR中并在那里使用它(可能需要对生成的代码进行一些小的修改才能从JAR中加载)。