当前位置: 首页 > 面试题库 >

Apache CXF + Spring:生成一个简单的客户端

丁承德
2023-03-14
问题内容

我已经开始使用Spring学习Apache CXF。首先,我尝试创建一个简单的客户端/服务器模型。

服务器端是: service.HelloWorld.java

@WebService
public interface HelloWorld {
  String sayHi(String text);
}

service.HelloWorldImpl.java

@WebService(endpointInterface = "service.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
   public String sayHi(String text) {
     return "Hello, " + text;
   }
}

客户端是: client.Client.java 公共类Client {

    public static void main(String[] args) {
          ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new  String[] {"cxf-client-servlet.xml"});
          HelloWorld client = (HelloWorld) context.getBean("client");
          System.out.println(client.sayHi("Batman"));
    }
}

cxf-client-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://cxf.apache.org/jaxws
    http://cxf.apache.org/schema/jaxws.xsd">

<bean id="client" class="service.HelloWorld" factory-bean="clientFactory" factory-method="create"/>

<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass" value="service.HelloWorld"/>
    <property name="address" value="http://localhost:8080/services/HelloWorld"/>
</bean>

问题是:要使客户端正常工作,我必须向客户端的项目html" target="_blank">添加service.HelloWorld(包+接口)。我听说在使用服务之前,我需要生成一个存根。所以这让我感到困惑。因此,什么是正确的方法,什么是最佳实践(使用某些合同优先的方法或类似方法可能更好)?稍后,我想添加WS-
Security,所以我需要有很强的背景=)

提前致谢。


问题答案:

如果您要进行代码优先的WS开发,则可以分发接口并将其提供给客户端。
我相信 @WebService在接口(仅实现)上不需要(?),因此客户端对此注释没有依赖性。

即使您正在执行代码优先的Web服务,您仍然可以下载Apache
CXF为您生成的WSDL文档,并将其提供给客户端。使用这种方法(被认为更成熟,更不用说可以在.NET等不同平台上使用了),客户端必须生成存根(使用像工具wsdl2java)。该过程本质上将自动创建非常相似的客户端界面。

这就是为什么这么多人喜欢合同优先开发的原因之一-使用相同的WSDL生成客户端存根和服务器端WS实现。这限制了(偶然)不兼容的范围。



 类似资料:
  • 我正在学习Swagger以及如何使用Swagger代码生成REST客户端。我知道如何使用Swagger做文档,我也知道如何使用Swagger生成一个简单的REST服务器,但我不知道如何使用Swagger代码生成一个简单的REST客户端。 例如,我有一个简单的应用程序,它是一个REST服务器,我想生成REST客户端。我能用斯威格代码吗? REST服务器的控制器: 之后,我开发了一个简单的REST客户

  • 我打算使用RingBuffer来创建一个非常简单的小型网络测试工具,叫做netclient。为此我需要向Makefile添加一些工具,来处理bin/目录下的小程序。 扩展Makefile 首先,为程序添加一些变量,就像单元测试的TESTS和TEST_SRC变量: PROGRAMS_SRC=$(wildcard bin/*.c) PROGRAMS=$(patsubst %.c,%,$(PROGRAM

  • 问题内容: 我正在寻找Java的SOAP客户端。 Apache Axis在我看来非常肿。我不明白为什么Java必须如此复杂。例如,在PHP中,我要做的就是: 我的$ response对象保存了我需要的所有信息。 有人可以建议我如何在Java中实现类似这样的事情而不会太麻烦呢? 提前谢谢了, 〜编辑1〜 @jarnbjo: 这对我非常有用。我遇到的困难是,需要哪些导入才能使代码运行? 我运行了以下命

  • 问题内容: Google的Chrome和IE等应用程序可以透明地处理Kerberos身份验证;但是我找不到适合这种透明度的“简单” Java解决方案。我发现的所有解决方案都需要存在一个krb5.conf文件和一个login.conf文件,以上应用似乎还需要这些文件。 用有效的Kerberos SSO功能构建Java应用程序的最佳方法是什么? [更新]:明确地说,我需要一个 CLIENT 端解决方案

  • 问题 你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像SSL那样的复杂。 解决方案 可以利用 hmac 模块实现一个连接握手,从而实现一个简单而高效的认证过程。下面是代码示例: import hmac import os def client_authenticate(connection, secret_key): ''' Authenticate client t

  • wex5是跨端移动开放框架,它与传统的前端页面开发最大的差异在于,采用了单页模式,实现了资源的不重复加载,那么如何做一个简单的门户页呢? 1.UI部分如图所示: 页面主要由contents以及其中一个content构成,content中放windowContainer组件,并在src属性中直接写入主页地址,这样有助于优化主页的打开速度。 2.创建shellImpl实例 index.w作为门户页面,