java.lang.ClassNotFoundException: com.sun.xml.wss.XWSSecurityException

java.lang.ClassNotFoundException: com.sun.xml.wss.XWSSecurityException

我有一个现有的基于 web-service 的 SOAP,我正尝试在其中使用 'XwsSecurityInterceptor' 和“SpringDigestPasswordValidationCallbackHandler”在其中实施 Spring 网络服务安全性.这就是我的 spring 配置的样子。

我正在 JBoss7.1 中部署此应用程序。1 AS.While 应用程序启动,以下异常是 thrown.It 抱怨找不到 'com.sun.xml.wss.XWSSecurityException'。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping#0': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: com/sun/xml/wss/XWSSecurityException Caused by: java.lang.ClassNotFoundException: com.sun.xml.wss.XWSSecurityException

现在我正试图了解该问题的根本原因。所以我从 POM 文件开始。

以下依赖项在 pom 中。

<dependency>
    <groupId>org.springframework.ws</groupId>
    <artifactId>spring-ws-core</artifactId>
    <version>${org.springframework.ws.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.ws</groupId>
    <artifactId>spring-ws-security</artifactId>
    <version>${org.springframework.ws.version}</version>
</dependency>

<dependency>
    <groupId>com.sun.xml.wss</groupId>
    <artifactId>xws-security</artifactId>
    <version>3.0</version>
</dependency>

<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

<dependency>
    <groupId>javax.xml</groupId>
    <artifactId>xmldsig</artifactId>
    <version>1.0</version>
</dependency>

作为我研发的一部分,我使用了 'spring-ws-core' 和 'spring-ws-security' 的旧版本 (2.1.2) 以及 'sjsxp' 的“1.0.2”版本.应用程序启动后,当我输入无效密码时出现身份验证错误。如果我提供正确的凭据,应用程序响应良好。这就是我想用这些 Jar 的最新版本实现的目标。

现在我想知道为什么 2.3.0/2.4.0 会丢失。

所以我试了一下'mvn dependency:tree -Dverbose',发现2.1.2版本自带了'xws-security'

所以我想添加那个依赖项。

    <dependency>
        <groupId>com.sun.xml.wss</groupId>
        <artifactId>xws-security</artifactId>
        <version>3.0</version>
    </dependency>

现在这迫使我再添加两个依赖项。我也加了那些。

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>

    <dependency>
        <groupId>javax.xml</groupId>
        <artifactId>xmldsig</artifactId>
        <version>1.0</version>
    </dependency>

但是 Maven 存储库中缺少第二个 'xmldsig'。我可以下载它并手动将它添加到我的本地 m2 存储库中。但我想以适当的方式修复它。 在搜索时我遇到了这个线程。 http://maven.40175.n5.nabble.com/where-to-get-xmldsig-1-0-jar-td92435.html

有人在谈论替代方案。

而且我可以看到它在 'spring-ws-security:jar' 的 2.3.0 版本中可用。

现在我的问题是,需要什么 avoided/added 才能使用最新版本的 jars 启动应用程序?祈祷.....

试试 spring-ws-security:2.4.0.RELEASEspring version 4.3.3.RELEASE

有时您需要成为软件考古学家才能调试这些东西。

查看 spring-ws-security:2.4.0.RELEASE 的 pom,您可以看到 xws-security:3.0 依赖项是可选的(除其他外)。您需要阅读 spring-ws-security 文档以确定您应该包含哪些 optional 依赖项。

假设您已经决定需要 xws-security 模块,您需要查看 it's pom,这就是考古学发挥作用的地方。这个模块可以追溯到 2008 年,当时 Java 5 仍然受到支持。 Java 6 (and/or Java EE) 及更高版本支持此工件依赖列表中的所有 API。将它们中的任何一个包含在您的构建或部署工件中都是一种痛苦的方法。

因此您应该排除它们:

<dependency>
    <groupId>com.sun.xml.wss</groupId>
    <artifactId>xws-security</artifactId>
    <version>3.0</version>
    <exclusions>
        <exclusion>
            <!-- Part of JDK -->
            <groupId>javax.xml.soap</groupId>
            <artifactId>saaj-api</artifactId>
        </exclusion>
        <exclusion>
            <!-- Part of Java EE -->
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
        </exclusion>
        <exclusion>
            <!-- Part of JDK -->
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </exclusion>
        <exclusion>
            <!-- Part of JDK -->
            <groupId>javax.xml.stream</groupId>
            <artifactId>stax-api</artifactId>
        </exclusion>
        <exclusion>
            <!-- Part of JDK -->
            <groupId>javax.xml.crypto</groupId>
            <artifactId>xmldsig</artifactId>
        </exclusion>
        <exclusion>
            <!-- Part of JDK -->
            <groupId>javax.xml.ws</groupId>
            <artifactId>jaxws-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>