WS-Security 不适用于 CXF

2024-03-19

我正在尝试使用 Apache CXF 开发支持 WS 安全的 Web 服务。我正在遵循的教程是here http://www.benmccann.com/blog/apache-cxf-tutorial-ws-security-with-spring/。不幸的是,我不断地收到以下错误,这让我非常懊恼。我正在使用 Spring 框架 3.0.5 和 CXF 2.3.3 以及 WSS4J 1.6.1。这可能是一个愚蠢的问题,但我几乎厌倦了寻找解决方案。请帮忙....

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.ws.security.util.WSSecurityUtil.decodeAction(Ljava/lang/String;Ljava/util/Vector;Lorg/apache/ws/security/WSSConfig;)I
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:839)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.NoSuchMethodError: org.apache.ws.security.util.WSSecurityUtil.decodeAction(Ljava/lang/String;Ljava/util/Vector;Lorg/apache/ws/security/WSSConfig;)I
org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor$WSS4JOutInterceptorInternal.handleMessage(WSS4JOutInterceptor.java:192)
org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor$WSS4JOutInterceptorInternal.handleMessage(WSS4JOutInterceptor.java:134)
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
$Proxy800.getEmployee(Unknown Source)
org.samith.web.controller.FrontController.frontRequestHandler(FrontController.java:35)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

这就是我的客户端代码的样子。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            new String[]{"SpringCXFClient-servlet.xml"});

    AuthService client = (AuthService) context.getBean("client");
    Employee employee = client.getEmployee("0223938");

    model.addAttribute("lastname", employee.getLastName());
    model.addAttribute(
            "firstname", employee.getFirstName());

和我的 clientCXF.xml 文件,

<bean id="proxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass" value="org.samith.AuthService"/>
    <property name="address" value="http://localhost:8080/SpringCXFServer/WSServices/corporateAuthService"/>
    <property name="inInterceptors">
        <list>
            <ref bean="logIn" />
        </list>
    </property>
    <property name="outInterceptors">
        <list>
            <ref bean="logOut" />
            <ref bean="saajOut" />
            <ref bean="wss4jOut" />
        </list>
    </property>
</bean>

<bean id="client" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" factory-bean="proxyFactory" factory-method="create" />


<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/views/" p:suffix=".jsp" p:order="2" />


<bean id="logIn" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<bean id="saajOut" class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
<bean id="wss4jOut" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameToken" />
            <entry key="user" value="ws-client" />
            <entry key="passwordType" value="PasswordText" />
            <entry key="passwordCallbackClass" value="org.samith.ClientPasswordCallback" />
        </map>
    </constructor-arg>
</bean>

和 ClientPasswordCallback.java 文件

public class ClientPasswordCallback implements CallbackHandler {


public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];

    // set the password for our message.
    pc.setPassword("myname");
}

}

最后是客户端 pom.file CXF 依赖项

<dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf</artifactId>
        <version>${cxf.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>${cxf.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-security</artifactId>
        <version>${cxf.version}</version>
    </dependency>

    <dependency>
        <groupId>xml-security</groupId>
        <artifactId>xmlsec</artifactId>
        <version>1.3.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.ws.security</groupId>
        <artifactId>wss4j</artifactId>
        <version>1.6.1</version>
    </dependency>

CXF 2.3.3 需要 WSS4J 1.5.x。 CXF 2.4.x 使用 WSS4J 1.6.x。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WS-Security 不适用于 CXF 的相关文章

随机推荐

  • 模拟 Retrofit 响应调用,但 Call 不起作用

    我正在嘲笑 APIService 的响应 不幸的是 它不起作用 我必须回电 但我不明白如何做 问题是如何发回 Call 对象 RunWith AndroidJUnit4 class class ApiServiceTest Test fun
  • 如何使用 API Gateway 上传 xls/xlsx 文件并将文件数据发送到 lambda 函数?

    我是 lambda 和 API 网关的新手 我使用此服务做了一些简单的事情 但现在我有一个要求 用户可以上传 Excel 文件 上传过程只是触发与 lambda 函数集成的 API 网关端点 我不想保存文件 我只想将文件数据以 CSV JS
  • 如何检查实体框架类型的属性是否可为 Null

    我有一个从数据库生成的 EntityDataModel 其中一个实体模型有两个属性 它们都是字符串类型 一个是 Nullable True 另一个是 Nullable False 如何在运行时检查 Nullable 属性的值 如果您的属性装
  • 如何从 Swagger API 声明生成 JSON-Schema

    我有 Swagger API 声明 用于使用招摇 v 1 2 https github com wordnik swagger spec blob master versions 1 2 md 我对 Swagger 的最初感觉是它非常接近
  • SQL Server - 同义词提示和技巧? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在xamarin表单中移动右侧搜索栏的搜索图标

    如何在 Xamarin 表单中移动右侧搜索栏的搜索图标 我正在寻找安卓和IOS 对于 Android 我使用了 SearchBarRenderer 下面的代码不起作用 有人知道该怎么做吗 请帮忙 protected override voi
  • 如何在AngularJS中创建全局变量

    我遇到这个问题 当您注册时 您会进入 用户 页面 它应该说 欢迎 用户名没有出现在网页上 原因我不确定 请帮助这里是plunkr http plnkr co edit qB3Gkeq5ji1YQyy0kpGH p preview http
  • 如何在Python中找到素数

    我是Python新手 我正在尝试计算给定范围内的素数 开发者分享的一些答案如下 import math def count primes num out for i in range 3 num 2 if all i j 0 for j i
  • 如何使用车把模板显示json对象键和值?

    我已经开始学习handlebar js 我正在努力显示 json 数据 我的 json 看起来像这样 var data record1 first name john city newyork name brit
  • CMPXCHG16B 正确吗?

    尽管我不确定为什么 但这似乎并不完全正确 建议会很好 因为 CMPXCHG16B 的文档非常少 我没有任何英特尔手册 template lt gt inline bool cas volatile types uint128 t src t
  • 使用 netbeans 中另一个 jFrame 的按钮关闭 jFrame?

    我在 netbeans 中创建了两个 jFrame 第一个被命名为MainFrame另一个是ExternalFrame 每个都有一个按钮 单击按钮MainFrame将设置ExternalFrame可见与MainFrame仍然在屏幕上 我想处
  • 如何Python请求像我的浏览器一样跟随URL

    我注意到 Python 的 requests 库并不像我的浏览器那样遵循某些 URL 重定向 例如 当我这样做时 response requests get http www bbmt org verify False allow redi
  • 为什么 Python 有 __ne__ 运算符方法而不仅仅是 __eq__?

    答案here https stackoverflow com questions 4352244 python implementing ne operator based on eq给出您想要的案例的手动参考 ne 返回除逻辑倒数之外的其
  • 带构造函数的抽象类,强制继承类调用它

    我有一个abstract带有构造函数的类XYZ string name 我还有一个继承自该抽象类的类 如何强制遗传要调用的类base string name 现在我可以使用new Inherited 并且它不会调用基本构造函数 我想强制用户
  • Mathematica 下调 Lhs 值

    有谁知道 Mathematica 中是否有一个内置函数可以获取 downvalue 规则的 lhs 没有任何保留 我知道如何编写代码来做到这一点 但这对于内置程序来说似乎已经足够基本了 例如 a 1 2 a 2 3 BuiltInIDoNo
  • Xcode 构建和运行错误:“进程启动失败:无法获取进程 216 的任务”

    更新到 Mavericks 并确保我也安装了 Xcode 的最新更新后 Xcode 突然无法在设备上启动应用程序 它会在我的 iPhone 上安装该应用程序 但在运行之前会抛出以下错误 进程启动失败 无法获取进程 216 的任务 这是更新后
  • Docker 中的 PostgreSQL - pg_hba.conf 允许从主机访问容器

    我想在 Docker 容器内运行 PostgreSQL 我正在构建自己的 Docker 镜像 因为我想包含 PostgreSQL 扩展 我应该编辑pg hba conf配置文件到 允许来自其他容器的访问 允许来自主机的访问 第一个非常简单
  • 无法读取未定义的属性“标签”

    我刚刚学习 Chart js 的工作原理 因此我直接使用了 Chart js API 页面上的示例代码 但它似乎不起作用 我将以下代码放入脚本标记中 并收到 无法读取未定义的属性 标签 错误 不确定这个错误意味着什么 function va
  • 从通用约束 Dart 调用静态方法

    我正在尝试从收到的泛型类型中调用静态方法 这可能吗 此外 我应用了类型约束 以便仅从其父类操作该对象 这是我想要实现的目标的一个简短示例 class A static func print A class B extends A stati
  • WS-Security 不适用于 CXF

    我正在尝试使用 Apache CXF 开发支持 WS 安全的 Web 服务 我正在遵循的教程是here http www benmccann com blog apache cxf tutorial ws security with spr