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

Ren*_*ith 0 java spring spring-ws spring-security maven

我有一个现有的基于SOAP的Web服务,我正在尝试使用'XwsSecurityInterceptor'和'SpringDigestPasswordValidationCallbackHandler'在其中实现Spring Web服务安全性.这就是我的弹簧配置的样子. 在此输入图像描述

我在JBoss7.1 AS中部署了这个应用程序.当应用程序启动时,抛出异常.它抱怨找不到'com.sun.xml.wss.XWSSecurityException'.

org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping#0'的bean时出错:init方法的调用失败; 嵌套异常是java.lang.NoClassDefFoundError:com/sun/xml/wss/XWSSecurityException引起: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>
Run Code Online (Sandbox Code Playgroud)

作为我研发的一部分,我选择了'spring-ws-core'和'spring-ws-security'的旧版本(2.1.2)以及'sjsxp'的'1.0.2'版本.应用程序启动后,当我提供无效密码时,我收到了身份验证错误.如果我提供正确的凭据,应用程序响应正常.这是我想用这些罐子的最新版本实现的.

现在我想知道为什么缺少2.3.0/2.4.0.

所以我尝试了'mvn依赖:tree -Dverbose',发现2.1.2版本带来了'xws-security'.

在此输入图像描述

所以我想添加那个依赖.

    <dependency>
        <groupId>com.sun.xml.wss</groupId>
        <artifactId>xws-security</artifactId>
        <version>3.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

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

    <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>
Run Code Online (Sandbox Code Playgroud)

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

有人在谈论另一种选择.

在此输入图像描述

我可以看到这是在'spring-ws-security:jar'的2.3.0版本中可用的.

在此输入图像描述

现在我的问题是,需要避免/添加什么,以便应用程序启动最新版本的jar?手指交叉.....

Ste*_*e C 7

有时你需要成为一名软件考古学家才能调试这些东西.

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

假设你已经决定需要这个xws-security模块,你需要看看它的pom,这是考古学发挥作用的地方.这个模块可以追溯到2008年,那时Java 5仍然受到支持.Java 6(和/或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>
Run Code Online (Sandbox Code Playgroud)