使用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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程