【问题标题】:Apache CXF + Spring: Generating a Simple ClientApache CXF + Spring:生成一个简单的客户端
【发布时间】:2012-01-27 11:58:57
【问题描述】:

我已经开始使用 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 公共类客户{

    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>

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

提前致谢。

【问题讨论】:

    标签: java web-services spring cxf


    【解决方案1】:

    您可以在客户端使用这样的简单弹簧配置 -

    <jaxws:client id="mywebServiceClient"
        serviceClass="com.saurzcode.TestService"
        address="http://saurzcode.com:8088/mockTestService">
    
        <jaxws:binding>
            <soap:soapBinding version="1.2" mtomEnabled="true" />
        </jaxws:binding>
    </jaxws:client>
    <cxf:bus>
        <cxf:outInterceptors>
            <bean class="com.saurzcode.ws.caller.SoapHeaderInterceptor" />
        </cxf:outInterceptors>
    </cxf:bus>
    

    如果不需要拦截器,请忽略它。

    更多详情请看post.

    【讨论】:

    • 如何将此客户端注入到 bean 中?
    • @MarcinErbel 你能详细说明你在寻找什么吗?
    • 好的,我的 mvn 存储库中出现了问题。我认为在 bean 中注入 Client 要复杂得多。 Nvm,但感谢您的回答。
    【解决方案2】:

    如果您正在进行代码优先的 WS 开发,那么可以分发接口并将其提供给客户端。 我相信接口上不需要@WebService(?)(只有实现),所以客户端对这个注解没有依赖。

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

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

    【讨论】:

    • 感谢您的回答。服务如何分发接口?
    • 所以你建议不要使用 JaxWsProxyFactoryBean?
    • 需要@WebService 注释 - 我已经检查了 =)
    • @Dmitry:你可以给客户端一个你在服务器上使用的Java接口,或者给他WSDL。在这种情况下,客户端负责从 WSDL生成客户端接口。在这两种情况下,JaxWsProxyFactoryBean 都用于创建实现该接口的代理。
    • @Dmitry:当然,here 是一篇关于 wsdl2java 与 Apache CXF 的文章。工作流程很简单——该工具为使用 XML Schema 声明的所有元素生成 Java 类,并为每个端点生成 Java 接口。 Apache CXF 客户端代码知道如何处理它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2017-06-13
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多