Web Services 使SOAP-Service使用与通过wsimport生成类时相同的身份验证

vbkedwbf  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(135)

我在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服务类添加代码,以便它自动进行身份验证吗?

d4so4syb

d4so4syb1#

无论您使用的是什么JAX-WS实现,都应该有一种方法来为SOAP调用设置代理身份验证。
如果这也适用于WSDL检索,则必须查看。
如果没有,我想您可以浏览一下项目中的JAX-WS实现的源代码,看看在哪里使用了该URL,以及您可能有哪些选项来引入身份验证机制,但我也可以建议一种不同的方法:

  • 将WSDL下载到网络中可以访问它的位置并使用它。-wsdllocation <location> .

您甚至可以将WSDL打包到JAR中并在那里使用它(可能需要对生成的代码进行一些小的修改才能从JAR中加载)。

相关问题