使用jax-ws和spring创建和web容器共端口的webservice服务

2024-09-02 14:48

本文主要是介绍使用jax-ws和spring创建和web容器共端口的webservice服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文介绍的webservice是建立在与spring集成的条件下【jdk自带的webservices会占用一个独立的端口,通过这个方法配置不需要】

1、修改WEB.XML文件,在spring的监听器配置之后加上如下内容

复制代码
<servlet><servlet-name>JAXWSServlet</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class><load-on-startup>5</load-on-startup>
</servlet><servlet-mapping><servlet-name>JAXWSServlet</servlet-name><url-pattern>/getNameWS</url-pattern></servlet-mapping><servlet-mapping><servlet-name>JAXWSServlet</servlet-name><url-pattern>/getCountWS</url-pattern></servlet-mapping>
复制代码

这里创建了2个webservices,访问路径是http://xxx:xxx/xxx/getNameWS?wsdl 和 http://xxx:xxx/xxx/getCountWS?wsdl

 

2、编写webservice实现类

复制代码
@WebService
@Component
public class GetNameWSImpl{@Resourceprivate XXDao xxDao;@WebMethodpublic XXVO searchName(String id) throws Exception {XXVO returnVO try {returnVO  = xxDao.xxx(id);} catch (Exception e) {e.printStackTrace();throw new Exception("webservice内部异常");}return returnVO;}
}
复制代码

3、spring配置文件里添加如下内容

复制代码
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.java.net/spring/core"xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://jax-ws.dev.java.net/spring/core
http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.dev.java.net/spring/servlet.xsd"><wss:binding url="/getNameWS"><wss:service><ws:service bean="#getNameWSImpl" /> <!--注入实现类--></wss:service></wss:binding></beans> 
复制代码

 

需要添加的jar包有:gmbal-api-only.jar/jaxb-impl.jar/jaxws-api.jar/jaxws-rt.jar/jaxws-spring-1.8.jar/management-api.jar/policy.jar/stax-ex.jar/streambuffer.jar/xbean-spring-3.0.jar

 

spring 的官方文档里有写,跟上面的方法有点差别:

 

21.5.5 Exposing servlet-based web services using JAX-WS

Spring provides a convenient base class for JAX-WS servlet endpoint implementations - SpringBeanAutowiringSupport. To expose our AccountService we extend Spring'sSpringBeanAutowiringSupport class and implement our business logic here, usually delegating the call to the business layer. We'll simply use Spring 2.5's @Autowiredannotation for expressing such dependencies on Spring-managed beans.

复制代码
/*** JAX-WS compliant AccountService implementation that simply delegates* to the AccountService implementation in the root web application context.** This wrapper class is necessary because JAX-WS requires working with dedicated* endpoint classes. If an existing service needs to be exported, a wrapper that* extends SpringBeanAutowiringSupport for simple Spring bean autowiring (through* the @Autowired annotation) is the simplest JAX-WS compliant way.** This is the class registered with the server-side JAX-WS implementation.* In the case of a Java EE 5 server, this would simply be defined as a servlet* in web.xml, with the server detecting that this is a JAX-WS endpoint and reacting* accordingly. The servlet name usually needs to match the specified WS service name.** The web service engine manages the lifecycle of instances of this class.* Spring bean references will just be wired in here.*/
import org.springframework.web.context.support.SpringBeanAutowiringSupport;@WebService(serviceName="AccountService")
public class AccountServiceEndpoint extends SpringBeanAutowiringSupport {@Autowiredprivate AccountService biz;@WebMethodpublic void insertAccount(Account acc) {biz.insertAccount(acc);}@WebMethodpublic Account[] getAccounts(String name) {return biz.getAccounts(name);}
}
复制代码

Our AccountServletEndpoint needs to run in the same web application as the Spring context to allow for access to Spring's facilities. This is the case by default in Java EE 5 environments, using the standard contract for JAX-WS servlet endpoint deployment. See Java EE 5 web service tutorials for details.

 

21.5.6 Exporting standalone web services using JAX-WS

The built-in JAX-WS provider that comes with Sun's JDK 1.6 supports exposure of web services using the built-in HTTP server that's included in JDK 1.6 as well. Spring'sSimpleJaxWsServiceExporter detects all @WebService annotated beans in the Spring application context, exporting them through the default JAX-WS server (the JDK 1.6 HTTP server).

In this scenario, the endpoint instances are defined and managed as Spring beans themselves; they will be registered with the JAX-WS engine but their lifecycle will be up to the Spring application context. This means that Spring functionality like explicit dependency injection may be applied to the endpoint instances. Of course, annotation-driven injection through @Autowired will work as well.

复制代码
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"><property name="baseAddress" value="http://localhost:8080/"/>
</bean><bean id="accountServiceEndpoint" class="example.AccountServiceEndpoint">...
</bean>...
复制代码

The AccountServiceEndpoint may derive from Spring's SpringBeanAutowiringSupport but doesn't have to since the endpoint is a fully Spring-managed bean here. This means that the endpoint implementation may look like as follows, without any superclass declared - and Spring's @Autowired configuration annotation still being honored:

复制代码
@WebService(serviceName="AccountService")
public class AccountServiceEndpoint {@Autowiredprivate AccountService biz;@WebMethodpublic void insertAccount(Account acc) {biz.insertAccount(acc);}@WebMethodpublic List<Account> getAccounts(String name) {return biz.getAccounts(name);}
}
复制代码

 

21.5.7 Exporting web services using the JAX-WS RI's Spring support

Sun's JAX-WS RI, developed as part of the GlassFish project, ships Spring support as part of its JAX-WS Commons project. This allows for defining JAX-WS endpoints as Spring-managed beans, similar to the standalone mode discussed in the previous section - but this time in a Servlet environment. Note that this is not portable in a Java EE 5 environment; it is mainly intended for non-EE environments such as Tomcat, embedding the JAX-WS RI as part of the web application.

The difference to the standard style of exporting servlet-based endpoints is that the lifecycle of the endpoint instances themselves will be managed by Spring here, and that there will be only one JAX-WS servlet defined in web.xml. With the standard Java EE 5 style (as illustrated above), you'll have one servlet definition per service endpoint, with each endpoint typically delegating to Spring beans (through the use of @Autowired, as shown above).

Check out https://jax-ws-commons.dev.java.net/spring/ for the details on setup and usage style.

21.5.8 Accessing web services using JAX-WS

Analogous to the JAX-RPC support, Spring provides two factory beans to create JAX-WS web service proxies, namely LocalJaxWsServiceFactoryBean andJaxWsPortProxyFactoryBean. The former can only return a JAX-WS service class for us to work with. The latter is the full-fledged version that can return a proxy that implements our business service interface. In this example we use the latter to create a proxy for the AccountService endpoint (again):

复制代码
<bean id="accountWebService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"><property name="serviceInterface" value="example.AccountService"/><property name="wsdlDocumentUrl" value="http://localhost:8888/AccountServiceEndpoint?WSDL"/><property name="namespaceUri" value="http://example/"/><property name="serviceName" value="AccountService"/><property name="portName" value="AccountServiceEndpointPort"/>
</bean>
复制代码

Where serviceInterface is our business interface the clients will use. wsdlDocumentUrl is the URL for the WSDL file. Spring needs this a startup time to create the JAX-WS Service. namespaceUri corresponds to the targetNamespace in the .wsdl file. serviceName corresponds to the service name in the .wsdl file. portName corresponds to the port name in the .wsdl file.

Accessing the web service is now very easy as we have a bean factory for it that will expose it as AccountService interface. We can wire this up in Spring:

<bean id="client" class="example.AccountClientImpl">...<property name="service" ref="accountWebService"/>
</bean>

From the client code we can access the web service just as if it was a normal class:

复制代码
public class AccountClientImpl {private AccountService service;public void setService(AccountService service) {this.service = service;}public void foo() {service.insertAccount(...);}
}
复制代码

NOTE: The above is slightly simplified in that JAX-WS requires endpoint interfaces and implementation classes to be annotated with @WebService@SOAPBinding etc annotations. This means that you cannot (easily) use plain Java interfaces and implementation classes as JAX-WS endpoint artifacts; you need to annotate them accordingly first. Check the JAX-WS documentation for details on those requirements.

这篇关于使用jax-ws和spring创建和web容器共端口的webservice服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130262

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B