当前位置: 首页 > 知识库问答 >
问题:

通过CXF的JAX-WS Web服务提供了不准确的wsdl

弘兴言
2023-03-14

我部署了一个简单的JAX-WS服务,首先构建契约。在JAX-WSendpoint配置中,我指定了原始wsdl的位置。但是,这不是cxf返回的wsdl。原始wsdl包含策略语句,这些语句是契约的重要组成部分,应该在wsdl中对服务使用者可见。

我知道我在endpoint上设置的wsdl位置是正确的。如果不正确,战争部署就会失败。我还记录了要再次检查的值。

在本地部署时,该服务在以下位置可用:http://localhost:8080/store-web-0.1.0/services/store。

问题:wsdl在以下位置可用:http://localhost:8080/store-web-0.1.0/services/store?wsdl不包含可以在原始wsdl中看到的策略语句。遗漏合同的这一重要部分是不可接受的。

问题:为什么wsdl在http://localhost:8080/store-web-0.1.0/services/store?wsdl缺少策略语句,而不仅仅是在jax wsendpoint上配置的原始wsdl?

更多细节如下。如果你还想看其他信息,请告诉我。

提前谢谢!

细节

我们正在使用: JBoss EAP 6.2,CXF 2.7.16(移动到CXF 3. x不是一个选项),Spring 4.1.6

在jboss-deployment-descriptor.xml文件中排除webservice子系统

JAX-WS配置类

@Bean StoreImpl storeImpl() {
    return new StoreImpl();
}

@Bean
public Endpoint storeServiceEndpoint() {
    EndpointImpl endpoint = new EndpointImpl(storeImpl());
    endpoint.publish("/store");

    // This configuration is located in the WAR, but WSDL is in separate JAR
    String wsdlLocation = this.getClass().getResource("/store.wsdl").toString();

    endpoint.setWsdlLocation(wsdlLocation);
    return endpoint;
}

Web服务实现类

@WebService(endpointInterface = "my.service.Store", serviceName = "store")
public class StoreImpl implements Store {

    public StoreImpl() {
    }

    @Override
    public BuySomethingResponse buySomething(BuySomethingRequest buySomethingRequest) {

        // operation implementation code here

        return response;
    }

}

Web应用程序初始化

@Order(value=1)
public class StoreWebInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) throws ServletException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(JAXWSEndpointConfig.class);

        container.addListener(new ContextLoaderListener(context));  
    }
}

@Order(value=2)
public class CXFWebInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) throws ServletException {
        ServletRegistration.Dynamic dispatcher = container.addServlet("CXFServlet", CXFServlet.class);  
       dispatcher.addMapping("/services/*");
   }
}

共有1个答案

高皓
2023-03-14

我能够找到问题,其中有3个。

问题#1正如问题中包含的JAX-WS配置类代码所示,我在发布endpoint后设置了wsdl位置。

问题2和问题3StoreImpl类上的@WebService注释需要设置两个附加属性:targetNamespaceportName。显然,它们的值需要与原始WSDL中定义的内容相匹配。

 类似资料:
  • 在 spring-cloud-netflix 设置中(一切都使用 feign、ribbon、eureka、zuul),是否有任何简单/优雅/开箱即用的方式(即基于 serviceId 与 URL 的发现)让 CompositeAB 通过 Zuul 与 ServiceA 和 ServiceB 通信?在我看到的所有示例中,CompositeAB 直接发现并调用 ServiceA,而不是通过 Servi

  • 我正在尝试将Apache CXF与Apache Camel集成。骆驼的配置: 现在,为了调用web服务上的特定操作,我使用以下方法: 但是在包含上述配置后,我得到< code > WARN servlet controller:149-在服务器控制台上找不到对http://localhost:8080/cxf service/services/cxfAuth的Observer的请求,并且在浏览器上

  • 我们运行一个Shibboleth身份提供者,越来越多的人要求我们使用非Shibboleth SAML解决方案与应用程序集成,并且在属性命名方面遇到了困难。用一个纯粹的Shibboleth IdP 我的问题是非Shibboleth服务提供商运营商,他们中的许多人拒绝重新映射IdP发送的属性,而是要求在IdP上定义新属性(携带现有属性中已有的值),使用服务提供商所有者指定的名称。这会导致IdP上的用户

  • 简介 服务提供器是所有 Laravel 应用程序引导中心。你的应用程序以及 Laravel 的所有核心服务都是通过服务提供器进行引导。 在这里,我们说的「引导」其实是指 注册 ,比如注册服务容器绑定、事件监听器、中间件,甚至是路由的注册。服务提供器是配置你的应用程序的中心。 Laravel 的 config/app.php 文件中有一个 providers 数组。数组中的内容是应用程序要加载的所有

  • 简介 服务提供者是所有 Lumen 应用程序启动的中心所在。包括你自己的应用程序,以及所有的 Lumen 核心服务,都是通过服务提供者启动的。 但是,我们所说的「启动」指的是什么?一般而言,我们指的是 注册 事物,包括注册服务容器绑定、事件侦听器、中间件,甚至路由。服务提供者是设置你的应用程序的中心所在。 若你打开 Lumen 的 bootstrap/app.php 文件,你将会看到 $app->

  • 服务提供者是组件和CatLib联系的桥梁。同时也是CatLib启动的中心,所有的服务都是通过服务提供者定义的。 名词定义 组件 组件与CatLib没有任何关系,她们可以独立的运行在不同的框架中。 服务 是由服务提供者将由一个或者多个组件组合而成,并提供一组可以被开发者使用的接口。 容器 CatLib 依赖注入容器。 架构图 创建服务提供者 服务提供者是用来描述一个服务如何为使用者提供服务的,这些关