WebService CXF系列: SpringBoot同一个项目中集成JaxWS和JaxRS

WebService CXF系列: SpringBoot同一个项目中集成JaxWS和JaxRS

  • 介绍
  • 项目介绍
      • 项目架构
      • 项目介绍
      • 项目集成的原则
  • SpringBoot集成JaxWS
      • 1. JaxWs的pom.xml文件中依赖CXF的JaxWS相关包
      • 2. JaxWs中的application-jaxws.yml文件定义cxf相关配置
      • 3. JaxWs的配置类JaxWsConfig,主要使用ServerFactoryBean进行服务发布
      • 4. JaxWs的业务处理
      • 5. JaxWs的理解点
  • SpringBoot集成JaxRS
      • 1. JaxRs的pom.xml文件中依赖CXF的JaxRS相关包
      • 2. JaxRs中的application-jaxrs.yml文件定义cxf相关配置
      • 3. JaxRs的配置类JaxRsConfig,主要使用ServerFactoryBean进行服务发布
      • 4. JaxRs的业务处理
      • 5. JaxRs的理解点
  • SpringBoot APP模块集成JaxRS和JaxWS
      • 1. app模块的pom.xml文件
      • 2. app模块的application.yml文件引入jaxws和jaxrs
      • 3. app模块的启动类
      • 4. app模块集成测试

介绍

  • 最近正在公司需要做和第三方对接的接口服务,故研究记录WebService CXF相关内容,方便后续学习工作。本文章只展现SpringBoot集成CXF发布服务的内容,后续会推出CXF客户端的内容;另外,由于水平比较浅,文章中有错误的地方还请评论中批评指正。
  • WebService是一种服务导向架构(SOA service-oriented architecture)的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。WebService应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多 API 所组成的,它们透过网络,例如 Internet 的远程服务器端,执行客户所提交服务的请求。WebService脚本平台需支持XML+HTTP。(基于SOAP)
  • Endpoint(服务端点),简单的来说它就是WebService 暴露出来的一个URL。通过这个URL,Client应用或者说调用端就可以访问到其对应的服务。WebService中一个基于SOAP的Service可以通过单独的一个Java类来实现。一个Endpoint interface,即SEI,是WebService公开时在JavaEE中使用的术语。 它使用@WebService进行注释,表明这是一个组件接口,它声明了向客户端公开的所有抽象方法。
  • SOAP是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。其主要核心是面向活动。
  • RESTful是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 RESTful架构或服务。其主要核心是面向资源。
  • REST可以看着是http协议的一种直接应用,默认基于json作为传输格式,使用简单,学习成本低效率高;而SOAP可以看着是一个重量级的协议,基于xml,SOAP在安全方面是通过使用XML-Security和XML-Signature两个规范组成了WS-Security来实现安全控制的。简单数据操作,无事务处理,开发和调用简单这些是使用REST架构风格的优势。而对于较为复杂的面向活动的服务,如果我们还是使用REST,很多时候都是仍然是传统的面向活动的思想通过转换工具再转换得到REST服务,这种使用方式是没有意义的。
  • JAX-WS全称是JavaTM API for XML-Based WebServices; 是针对WebService。
  • JAX-RS :全称是 JavaTM API for RESTful Web Services;是针对RESTful HTTP Service。

项目介绍

项目架构

WebService CXF系列: SpringBoot同一个项目中集成JaxWS和JaxRS_第1张图片

项目介绍

  1. common是共用模块,存放请求和响应的对象结构,和一些常量接口等;(暂时为空模块)
  2. jaxws和jaxrs分别是针对webservice和restful service的服务模块;
  3. app是集成jaxws和jaxrs的启动模块;

项目集成的原则

  1. POM处理
  2. YAML处理
  3. 配置处理
  4. 业务处理

SpringBoot集成JaxWS

1. JaxWs的pom.xml文件中依赖CXF的JaxWS相关包

   <dependencies>
        <dependency>
            <groupId>com.valuegroupId>
            <artifactId>commonartifactId>
        dependency>
        <dependency>
            <groupId>org.apache.cxfgroupId>
            <artifactId>cxf-spring-boot-starter-jaxwsartifactId>
            <version>${cxf.version}version>
        dependency>
    dependencies>

2. JaxWs中的application-jaxws.yml文件定义cxf相关配置

    server:
      tomcat:
        uri-encoding: UTF-8

    spring:
      application:
        name: jaxws

    cxf:
      path: /
      servlet:
        load-on-startup: 1

3. JaxWs的配置类JaxWsConfig,主要使用ServerFactoryBean进行服务发布

@Configuration
@ConditionalOnClass(CXFServlet.class)
public class JaxWsConfig {

    @Autowired
    CxfAutoConfiguration cxfAutoConfiguration;

    @Autowired
    private SpringBus bus;
 	/**
     * 这里也可以使用服务端点方式或CXFServlet发布服务
     */
	/*
    @Bean
    public Endpoint printerpEndpoint(){
        EndpointImpl endpoint = new EndpointImpl(bus, helloService());
        endpoint.publish("/api");
        endpoint.getFeatures().add(new LoggingFeature());
        return endpoint;
    }*/

   /* @Bean
    public ServletRegistrationBean cxfServletRegistration(){
        return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
    }*/

    @Bean
    public HelloService helloService(){
        return new HelloServiceImpl();
    }

    @Bean
    public Server jaxWsServer(){
        JaxWsServerFactoryBean wsEndpoint = new JaxWsServerFactoryBean();
        wsEndpoint.setBus(bus);
        wsEndpoint.setAddress("/soap/");
        wsEndpoint.setServiceClass(HelloService.class);
        wsEndpoint.setServiceBean(helloService());
        wsEndpoint.setFeatures(Arrays.asList(new LoggingFeature()) );
        return wsEndpoint.create();
    }
}

4. JaxWs的业务处理

/**
 * 服务接口
 */
@WebService(name = "HelloService" ,
        targetNamespace = "http://soap.value.com")
public interface HelloService {

    @WebMethod(action = "sayHello")
    @WebResult(name = "response", partName = "response")
    @XmlElement(required = true)
    String sayHello(@WebParam(name = "a", partName = "a") String a);
}
/**
 * 服务实现
 */
@SOAPBinding(style = SOAPBinding.Style.RPC,use = SOAPBinding.Use.LITERAL)
@WebService(serviceName = "HelloService",targetNamespace = "http://soap.value.com", endpointInterface = "com.value.jaxws.service.HelloService")
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String a) {
        return "Hello Springboot Integrated CXF JaxWS : " + a;
    }
}

5. JaxWs的理解点

  1. 需要理解Endpoint、JaxWsServerFactoryBean两种发布服务方式
  2. 注解的使用

SpringBoot集成JaxRS

1. JaxRs的pom.xml文件中依赖CXF的JaxRS相关包

	<dependencies>
        <dependency>
            <groupId>com.valuegroupId>
            <artifactId>commonartifactId>
        dependency>
        <dependency>
            <groupId>org.apache.cxfgroupId>
            <artifactId>cxf-spring-boot-starter-jaxrsartifactId>
            <version>${cxf.version}version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
        dependency>
        <dependency>
            <groupId>org.apache.cxfgroupId>
            <artifactId>cxf-rt-rs-extension-providersartifactId>
            <version>${cxf.version}version>
        dependency>
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>${fastjson.version}version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrsgroupId>
            <artifactId>jackson-jaxrs-json-providerartifactId>
        dependency>
    dependencies>

2. JaxRs中的application-jaxrs.yml文件定义cxf相关配置

    server:
      tomcat:
        uri-encoding: UTF-8

    spring:
      application:
        name: jaxrs
      jackson:
        #日期格式化
        date-format: yyyy-MM-dd HH:mm:ss
        serialization:
          #格式化输出
          indent_output: true
          #忽略无法转换的对象
          fail_on_empty_beans: false
          #序列化带根对象
          wrap_root_value: true
        #设置空如何序列化
        defaultPropertyInclusion: NON_EMPTY
        deserialization:
          #允许对象忽略json中不存在的属性
          fail_on_unknown_properties: false
          #反序列化带根对象
          unwrap_root_value: true
        parser:
          #允许出现特殊字符和转义符
          allow_unquoted_control_chars: true
          #允许出现单引号
          allow_single_quotes: true
    cxf:
      path: /

3. JaxRs的配置类JaxRsConfig,主要使用ServerFactoryBean进行服务发布

@Configuration
public class JaxRsConfig {

  @Autowired
  private SpringBus bus;

  @Autowired
  private ObjectMapper objectMapper;


  @Bean
  public Server jaxRsServer() {
    JAXRSServerFactoryBean rsEndpoint = new JAXRSServerFactoryBean();
    rsEndpoint.setBus(bus);
    rsEndpoint.setAddress("/rest/");
    rsEndpoint.setProviders(Arrays.asList(jacksonJaxbJsonProvider()));
    rsEndpoint.setFeatures(Arrays.asList(new LoggingFeature()));
    rsEndpoint.setServiceBeans(Collections.singletonList(new HelloServiceImpl()));
    return rsEndpoint.create();
  }

  /**
   * 配置一个对象与json转换的工具
   */

  @Bean
  public JacksonJaxbJsonProvider jacksonJaxbJsonProvider() {
    return new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS);
  }
}

4. JaxRs的业务处理

/**
 * 服务接口
 */
@Path("/sayHello")
public interface HelloService {

    @GET
    @Path("/info")
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(MediaType.TEXT_PLAIN)
    String sayHello(@QueryParam("a") String a);
}
/**
 * 服务实现
 */
@Service
@Slf4j
public class HelloServiceImpl implements HelloService {
  @Override
  public String sayHello(String a) {
    return "Hello Springboot Integrated CXF JaxRS : " + a;
  }
}

5. JaxRs的理解点

  1. 知道JacksonJaxbJsonProvider的配置方式,方便POST请求参数为对象时的处理。

SpringBoot APP模块集成JaxRS和JaxWS

1. app模块的pom.xml文件

   <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>com.valuegroupId>
            <artifactId>jaxwsartifactId>
        dependency>
        <dependency>
            <groupId>com.valuegroupId>
            <artifactId>jaxrsartifactId>
        dependency>
    dependencies>

2. app模块的application.yml文件引入jaxws和jaxrs

server:
  port: 8080
  tomcat:
    uri-encoding: UTF-8
  servlet:
    context-path: /datasync

spring:
  application:
    name: value-datasync
  profiles:
    active: dev
    include: jaxws, jaxrs

3. app模块的启动类

@SpringBootApplication
public class SpringbootCxfApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootCxfApplication.class,args);
    }
}

4. app模块集成测试

  1. 集成JaxRs的测试
    • URL:http://localhost:8080/datasync/rest/sayHello/info?a=nnnnn
    • 测试工具:PostMan

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PO5yTNOv-1620698642958)(C:\Users\yinchen\AppData\Roaming\Typora\typora-user-images\image-20210511095759567.png)]

  1. 集成JaxWs的测试
    • URL: http://localhost:8080/datasync/soap?wsdl
    • 测试工具:SoapUI

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MJxj8zgA-1620698642973)(C:\Users\yinchen\AppData\Roaming\Typora\typora-user-images\image-20210511100051620.png)]

你可能感兴趣的:(CXF,Springboot,jax-rs,jax-ws)