Spring框架整合RMI和Hessian,以及Spring框架中的HttpInvoker来构建远程服务时,可以发现Spring框架都会提供了一个对应导出器RMIServiceExporter
、HessianServiceExporter
、HttpInvokerServiceExporter
,并且发布服务的方式都极其相似。因此Spring整合JAX-WS后也有一个对应的导出器类SimpleJaxWsServiceExporterm
,但SimpleJaxWsServiceExporter
要求JAX-WS运行时支持将服务发布到指定的地址上,JDK1.6
版本自带的JAX-WS可符合要求,其他版本可能并不满足。因此当JAX-WS不支持将其发布到指定地址,需要以传统的方式来编写服务端,这种情况下服务端的生命周期由JAX-WS来管理,而不是Spring。此时为了使用Spring中依赖注入的功能(如@Autowired注解功能),需要继承SpringBeanAutowiringSupport
,通过继承的方式就可以使用@Autowired
注解功能。
————重要的类
SimpleJaxWsServiceExporter
将Spring管理的Bean发布为JAX-WS运行时的服务端点,与其他服务导出器(如RMIServiceExporter)有点不同,不需要为SimpleJaxWsServiceExporter
指定要导出的Bean的引用,它会将使用JAX-WS注解所标注(如注解@WebService
、@WebMethod
等)的所有bean发布为JAX-WS服务。本文主要介绍SimpleJaxWsServiceExporter
来发布服务。JaxWsPortProxyFactoryBean
是一个Spring的工厂bean,它能生成一个知道如何与远程Web服务交互的代理,这些代理实现了服务接口,代理可以被注入到其他的bean中,从而远程服务调用就类似本地调用一样简单。项目介绍:
——Common项目
<dependency>
<groupId>com.corpgroupId>
<artifactId>commonartifactId>
<version>1.0.0version>
dependency>
——JAX-WS服务端:服务端,实现common中的接口,提供JAX-WS远程服务,项目名称是WebServiceServer
。
——JAX-WS客户端:客户端,将远程服务JAX-WS的代理注入,进行服务的调用,项目名称是WebServiceConsumer
。
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);
}
步骤一:编写服务接口的实现类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),结果如下:
由于服务端已经启动一个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);
}
}
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);
}
}
1.Spring官方文档
2.《Spring实战(Spring IN ACTION)》