【WebService学习】-----SpringBoot整合JAX-WS构建WebService

文章目录

          • 1.简介
          • 2.Spring整合JAX-WS
            • 2.1 介绍
            • 2.2 Common
            • 2.3 WebServiceServer(服务端)
            • 2.4 WebServiceConsumer(客户端)
          • 3.测试
          • 4.参考

1.简介

   Spring框架整合RMI和Hessian,以及Spring框架中的HttpInvoker来构建远程服务时,可以发现Spring框架都会提供了一个对应导出器RMIServiceExporterHessianServiceExporterHttpInvokerServiceExporter,并且发布服务的方式都极其相似。因此Spring整合JAX-WS后也有一个对应的导出器类SimpleJaxWsServiceExporterm,但SimpleJaxWsServiceExporter要求JAX-WS运行时支持将服务发布到指定的地址上,JDK1.6版本自带的JAX-WS可符合要求,其他版本可能并不满足。因此当JAX-WS不支持将其发布到指定地址,需要以传统的方式来编写服务端,这种情况下服务端的生命周期由JAX-WS来管理,而不是Spring。此时为了使用Spring中依赖注入的功能(如@Autowired注解功能),需要继承SpringBeanAutowiringSupport,通过继承的方式就可以使用@Autowired注解功能。

————重要的类
   

  • SimpleJaxWsServiceExporter:SimpleJaxWsServiceExporter将Spring管理的Bean发布为JAX-WS运行时的服务端点,与其他服务导出器(如RMIServiceExporter)有点不同,不需要为SimpleJaxWsServiceExporter指定要导出的Bean的引用,它会将使用JAX-WS注解所标注(如注解@WebService@WebMethod等)的所有bean发布为JAX-WS服务。本文主要介绍SimpleJaxWsServiceExporter来发布服务。
  • JaxWsPortProxyFactoryBean:JaxWsPortProxyFactoryBean是一个Spring的工厂bean,它能生成一个知道如何与远程Web服务交互的代理,这些代理实现了服务接口,代理可以被注入到其他的bean中,从而远程服务调用就类似本地调用一样简单。
    【WebService学习】-----SpringBoot整合JAX-WS构建WebService_第1张图片
2.Spring整合JAX-WS
2.1 介绍

项目介绍:
——Common项目

  • 服务端和客户端都要使用接口和实体类,将实体类和接口定义到公共项目Common中,打成jar包,在客户端和服务端添加jar包依赖。

     <dependency>
      	<groupId>com.corpgroupId>
		<artifactId>commonartifactId>
		<version>1.0.0version>
     dependency>

——JAX-WS服务端:服务端,实现common中的接口,提供JAX-WS远程服务,项目名称是WebServiceServer

——JAX-WS客户端:客户端,将远程服务JAX-WS的代理注入,进行服务的调用,项目名称是WebServiceConsumer

2.2 Common
  • 实体类,需要实现序列化接口Serializable
public class Account implements Serializable {

  private static final long serialVersionUID = 1L;
  private String name;

  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String toString() {
    return "Account [name=" + name + "]";
  }
}
  • 提供服务的接口AccountService,在接口上添加@WebService,在属性里面设置服务名称serviceName和名称空间targetNameSpace,XML Web Service的名称name以及WSDL文件中的portName,在方法上添加注解@WebMethod
@WebService(serviceName="AccountService",targetNamespace="http://corp.com/",
name="AccountServiceSoap",portName="AccountServiceSoap")
public interface AccountService {
  
  @WebMethod
  public void insertAccount(Account account);
  
  @WebMethod
  public List<Account> getAccounts(String name);
}

2.3 WebServiceServer(服务端)

步骤一:编写服务接口的实现类AccountServiceImpl,此类里面主要编写主要的业务逻辑。在此类的@WebService注解里面添加了一个属性endpointInterface,表示的是服务接口全路径, 指定为SEI(Service EndPoint Interface)服务端点接口,此处是AccountService所在的全路径。

@Service
@WebService(endpointInterface="com.spring.service.AccountService",serviceName="AccountService",targetNamespace="http://soa.corp.com/service",name="AccountServiceSoap",portName="AccountServiceSoap")
public class AccountServiceImpl implements AccountService{

  @WebMethod
  public List<Account> getAccounts(String name) {
    List<Account> accounts = new ArrayList<>();
    Account account = new Account();
    account.setName("DreamTech1113");
    accounts.add(account);
    return accounts ;
  }

  @WebMethod
  public void insertAccount(Account account) {
    return;
  }
}

步骤二:配置SimpleJaxWsServiceExporter,此类里面主要编写主要的业务逻辑。

@Configuration
public class WsServiceConfiguration {

  @Bean
  public SimpleJaxWsServiceExporter jaxWsExporter() {
    SimpleJaxWsServiceExporter exporter = new SimpleJaxWsServiceExporter();
    exporter.setBaseAddress("http://localhost:8887/");
    return exporter;
  }
}
<font color="darkc">步骤四:</font>`SpringBoot`项目启动类。

```java
@SpringBootApplication
@ComponentScan(basePackages="com.corp")
public class Application {
  
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

启动SpringBoot项目,此时可以在页面访问WSDL文件,访问地址:http://localhost:8887/AccountService?WSDL,其中AccountService是服务名称(serviceName),结果如下:
【WebService学习】-----SpringBoot整合JAX-WS构建WebService_第2张图片

2.4 WebServiceConsumer(客户端)

由于服务端已经启动一个tomcat(占用8080端口),需要将客户端的项目tomcat端口修改,在src/main/resources目录下面创建一个文件application.properties,内容为:

server.port=8889

步骤一:编写服务调用类WebServiceController

@RestController
public class WebServiceController {

  @Autowired
  private AccountService accountService;
  
  public void setAccountService(AccountService accountService) {
    this.accountService = accountService;
  }

  @RequestMapping("/home")
  public List<Account> getAccount(){
    return accountService.getAccounts("home");
  }
}

步骤二:编写客户端JAX-WS代理类。

@Configuration
public class WsServiceConfiguration {

  @Bean
  public JaxWsPortProxyFactoryBean accountService() throws MalformedURLException {
    JaxWsPortProxyFactoryBean jaxProxy  = new JaxWsPortProxyFactoryBean();
    jaxProxy.setWsdlDocumentUrl(new URL("http://localhost:8887/AccountService?wsdl"));
    jaxProxy.setServiceName("AccountService");
    jaxProxy.setServiceInterface(AccountService.class);
    jaxProxy.setPortName("AccountServiceSoap");
    jaxProxy.setNamespaceUri("http://soa.corp.com/service");
    return jaxProxy;
  }
}

步骤三:SpringBoot项目启动类。

@SpringBootApplication
@ComponentScan(basePackages="com.corp")
public class Application {
  
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
3.测试

1.启动客户端项目WebServiceConsumer,页面访问地址:http://localhost:8889/home.结果是:

[{“name”:“DreamTech1113”}]

2.单元测试:使用的Spring Junit4进行单元测试,需要添加Spring测试的jar包。

 	<dependency>
		 	<groupId>org.springframeworkgroupId>
			<artifactId>spring-testartifactId>
			<scope>testscope>
		dependency>
@RunWith(SpringJUnit4ClassRunner.class)
//加载配置类
@ContextConfiguration(classes=WsServiceConfiguration.class)
public class TestAccount {

  @Autowired
  private AccountService accountService;
  
  @Test
  public void testAccount() {
    List<Account> accounts = accountService.getAccounts("name");
    System.out.println(accounts);
  }
}
4.参考

  1.Spring官方文档
  2.《Spring实战(Spring IN ACTION)》

你可能感兴趣的:(WebService,JAX-WS,WebService)