将Java服务公开为Web服务
如果在最初的項目體系結構中未考慮Web服務,這將不會有些棘手。 您可能涉及不同種類的項目體系結構,并使用不同種類的技術。 作為開發人員,由于可能存在很多依賴關系,因此您不能更改某些體系結構和配置。
Internet上的大多數教程都介紹了創建Web服務的基本內容。 有時,“ Hello world”應用程序或某個時候可能是像這樣的簡單計算器。 這些教程非常有助于您對Web服務有基本的了解。 但是現實世界的場景要比這復雜十倍,并且在遵循此類教程時必須面對困難。
實際情況
在本教程中,我將解釋“我們如何真正解決您的主管提出的現實世界的要求”。 我將解釋最近遇到的相同情況。
一個醫療保健組織在島上經營著許多藥房。 他們有一個處理所有庫存,定價和開票,發行藥房物品等的Web應用程序。他們需要通過Web服務公開藥房物品的價格,以便藥房中的客戶應用程序可以通過Web服務訪問這些產品。 他們的Web應用程序是在struts2,Spring和休眠的集成環境中開發的。 它具有所有Spring管理的DAO類以及服務類。 該應用程序使用spring的自動接線技術,組件掃描,事務管理等。在這種背景下,我需要將藥房價格作為Web服務公開。 那就是我們當前藥房服務中的某些方法需要通過網絡服務公開給外部。
我將向您展示,如何通過對現有項目進行最小的修改來實現這種要求。
附加圖書館
我將使用JAX-WS實現Web服務。 我在項目中使用了JAX-WS 2.2。 您可以從此處下載所需的JAX-WS版本。 這提供了一些可用于生成Web服務及其客戶端內容的工具。 下載所需的庫版本后,將其解壓縮到本地計算機中的某些位置。 我已將其放在主文件夾中。
即:/home/semika/jaxws-ri-2.2
實施網絡服務
我已經有了用于Web的內部使用的Spring托管服務類和用于藥房項目的DAO類。 那些沒有暴露在外面。 假設,我們需要公開findAll()方法,該方法以Web服務的形式返回“ PharmacyService”接口的“ PharmacyItem”列表。
為了方便起見,我將向您展示“ PharmacyServiceImpl” java類,該類用于執行常規藥房項目操作。 這是通常的Springman豆。 請記住,此類的方法目前只能用于我們的Web應用程序的內部操作。 這些沒有作為Web服務公開。
PharmacyServiceImpl.java
如您所見,我在實現類中具有“ PharmacyItemDao”的自動連線實例。 眾所周知,這是一個Spring托管服務實現類。
接下來,我們將為上面的spring托管服務bean實現Web服務端點類,以將其方法公開為Web服務方法。 為了清楚起見,我創建了一個單獨的類作為Web服務端點。
PharmacyItemServiceEndPoint.java
package com.slauto.service.ws; import javax.jws.WebMethod; import javax.jws.WebService;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.slauto.exceptions.DataAccessException; import com.slauto.model.pharmacy.PharmacyItem; import com.slauto.service.pharmacy.api.PharmacyItemService;/*** @author semika**/ @WebService(serviceName='pharmacyItemService') public class PharmacyItemServiceEndPoint {@WebMethodpublic List<Pharmacyitem> findAll() throws DataAccessException {ApplicationContext context = new ClassPathXmlApplicationContext('applicationContext.xml'); PharmacyItemService pharmacyItemService = (PharmacyItemService)context.getBean('pharmacyItemService');return pharmacyItemService.findAll();} }如您在這里看到的,我正在使用'pharmacyItemService'bean,我們的Web應用程序使用它來訪問相關的服務方法。 “ pharmacyItemService”是一種常用的Spring mange bean,用于執行日常藥房項目操作。 沒什么特別的。 特別注意,指示此類的@WebService和@WebMethod注釋用作Web服務端點。
在這里,我通過應用程序上下文獲取服務類實例。 此外,我們可以通過擴展spring提供的' SpringBeanAutowiringSupport '的端點類,來使用Spring自動連接Web服務端點類。 在這種情況下,我們不需要像上面所做的那樣創建應用程序上下文實例。 我無法完成這項工作,這就是為什么我使用了上述技術。
使用“ SpringBeanAutowiringSupport ”,在部署Web服務時(說明如下),我遇到了一個異常,很難解決。 所以我選擇了這項技術。 無論如何,我不喜歡上面的內容:)。
生成Web服務
我正在使用JAX-WS提供的apt , wsgen和wsimport工具來生成JAX-WS服務中使用的可移植工件。 “ build.xml ”文件的相關ant目標如下。
您可能需要在“ build.xml”文件頂部聲明的以下屬性。
屬性:
<property name='tomcat.home' value='/home/semika/apache-tomcat-7.0.25' /> <property name='jaxws.home' value='/home/semika/jaxws-ri-2.2' /> <property name='build.classes.home' value='${basedir}/WEB-INF/classes' /> <property name='java.home' value='/home/semika/java/jdk1.6.0_30'>類路徑:
<path id='project.class.path'><pathelement location='${java.home}/../lib/tools.jar' /><fileset dir='${jaxws.home}/lib'><include name='*.jar' /></fileset><pathelement location='${basedir}/WEB-INF/classes' /><fileset dir='${basedir}/WEB-INF/lib' includes='*.jar' /> </path>JAX-WS apt工具目標:
<target name='apt' depends='javac'><taskdef name='apt' classname='com.sun.tools.ws.ant.Apt'><classpath refid='project.class.path' /></taskdef><apt fork='true'debug='true'verbose='true'destdir='${basedir}/WEB-INF/classes'sourcedestdir='${basedir}/WEB-INF/src'sourcepath='${basedir}/WEB-INF/src'><classpath><path refid='project.class.path' /></classpath><option key='r' value='${basedir}/WEB-INF' /><source dir='${basedir}/WEB-INF/src'><include name='**/*.java'/></source></apt> </target> 如果您想進一步了解JAX-WS提供的apt工具,請查看this 。 運行apt目標時,它將掃描源路徑(src文件夾),并為使用@WebService注釋的類生成所需的* .class和* .java文件。 在這種情況下,適用于“ PharmacyItemServiceEndPoint.java”。 如果查看“ PharmacyItemServiceEndPoint”所在的包,則可以看到它創建了一個名為“ jaxws ”的新包。 在該程序包中,我可以看到以下三個Java文件。
DataAccessExceptionBean.java
FindAll.java FindAllResponse.java
這些類由該工具生成,并且根據您的服務實現和Web服務涉及的相關類而有所不同。 實際上,您不必擔心這些生成的東西。
同樣,您可以在/ WEB-INF / classes文件夾下看到相關的* .class文件。
JAX-WS wsgen工具目標:
<target name='wsgen' depends='apt'> <taskdef name='wsgen' classname='com.sun.tools.ws.ant.WsGen'><classpath path='project.class.path'/></taskdef><wsgen xendorsed='true'sei='com.slauto.service.ws.PharmacyItemServiceEndPoint'destdir='${basedir}/WEB-INF/classes' resourcedestdir='${wsdl.dir}'sourcedestdir='${basedir}/WEB-INF/src' keep='true'verbose='true'genwsdl='true'><classpath refid='project.class.path'/></wsgen> </target> wsgen工具將為我們的端點Web服務類生成WSDL文件。 運行此目標后,請查看$ {wsdl.dir}的位置。 您可以看到我們的WSDL文件已經生成。 如果您想進一步了解JAX-WS提供的wsgen工具,請研究this 。
部署Web服務
我想用通常的服務器啟動來部署Web服務。 因此,我必須將以下配置添加到web.xml文件中。
<listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet><servlet-name>pharmacyItemService</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet> <servlet-mapping><servlet-name>pharmacyItemService</servlet-name><url-pattern>/pharmacyItemService</url-pattern> </servlet-mapping>正如我之前告訴您的那樣,當部署具有從' SpringBeanAutowiringSupport '擴展的端點類的Web服務時,它給出了一個例外。 因此,我決定通過應用程序上下文獲取服務bean。 如果您能解決這種情況,請直接發布。
而且,您需要在WEB-INF文件夾下創建sun-jaxws.xml并聲明Web服務端點,如下所示。
<?xml version='1.0' encoding='UTF-8'?> <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'> <endpointname='pharmacyItemService'implementation='com.slauto.service.ws.PharmacyItemServiceEndPoint'url-pattern='/pharmacyItemService'/> </endpoints>我正在使用apache tomcat 7.0.25部署Web服務。 您需要告訴tomcat啟動tomcat時可以在哪里找到JAX-WS庫。 您可以編輯位于CATALINA_HOME / conf文件夾中的“ catalina.properties ”文件。 查找common.loader屬性。 大多數情況如下。
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar對其進行如下修改。
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/home/semika/jaxws-ri-2.2/lib/*.jar如您所見,我已經在逗號分隔列表的末尾添加了我的JAX-WS庫路徑。 這些類對tomcat內部類和tomcat容器中部署的所有Web應用程序均可見。 現在,您可以將.war文件復制到tomcat的webapps文件夾中,然后啟動tomcat。 您的Web服務應已部署。 為了確認您的Web服務已正確部署,您可以檢查它的WSDL 。 對于WSDL文件,您應該以以下格式檢查URL。
http:// localhost:8080 / <您的上下文名稱> / pharmacyItemService?wsdl
如果您可以在瀏覽器中看到WSDL文件,則說明您已經完成,您已經成功部署了Web服務。
生成Web服務客戶端
現在,我們已經部署了Web服務。 接下來,我們將看到如何編寫客戶端類以使用Java程序訪問Web服務。 您可以創建一個簡單的Java項目,并在其中使用以下build.xml文件。 我已經放置了完整的build.xml文件用于客戶端生成。 我正在使用JAX-WS附帶的wsimport工具來生成Web服務客戶端工件。
<?xml version='1.0' encoding='utf-8' ?> <project name='WS-client' default='wsimport' basedir='.'><property name='jaxws.home' value='/home/semika/jaxws-ri-2.2' /><property name='java.home' value='/home/semika/java/jdk1.6.0_30'/><path id='jaxws.classpath'><pathelement location='${java.home}/../lib/tools.jar' /><fileset dir='${jaxws.home}/lib'><include name='*.jar' /></fileset></path><target name='wsimport'> <taskdef name='wsimport' classname='com.sun.tools.ws.ant.WsImport'><classpath path='jaxws.classpath'/></taskdef><wsimport xendorsed='true'debug='true'verbose='true'keep='true'destdir='src'package='com.slauto.service'wsdl='http://localhost:8080/slautomanage/pharmacyItemService?wsdl'></wsimport></target> </project> 如果您想進一步了解wsimport工具,可以查看this 。 運行上述目標后,只需看看在wsimport屬性下指定的包即可。 您將看到生成的一組Java文件。 您可以將它們編譯并捆綁到單個client.jar文件中,并且可以與需要此Web服務的任何Java項目一起使用。
我創建了一個非常簡單的java類,以通過Web服務獲取藥房信息。
客戶端程序
package com.slauto.client;import java.util.List;import com.slauto.service.PharmacyItem; import com.slauto.service.PharmacyItemService; import com.slauto.service.PharmacyItemServiceEndPoint;/*** @author semika**/ public class Client {/*** @param args*/public static void main(String[] args) {PharmacyItemService p = new PharmacyItemService();PharmacyItemServiceEndPoint ep = p.getPharmacyItemServiceEndPointPort();List<PharmacyItem> pharmacyItems = ep.findAll();for (PharmacyItem pharmacyItem : pharmacyItems) {System.out.println(pharmacyItem.getCode()); }}} 太好了嗎? 運行該課程后,您將看到顯示的藥房商品代碼列表。 這些藥房信息通過具有復雜環境的Web應用程序部署的Web服務來傳遞。
就是本教程中的內容。 希望對您有所幫助,如果您從本教程中學習到一些東西,請不要忘了發表評論。
參考: 如何將現有服務公開為Web服務? 從我們的JCG合作伙伴 Semika loku kaluge在Code Box博客上獲得。
翻譯自: https://www.javacodegeeks.com/2012/06/expose-java-service-as-web-service.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的将Java服务公开为Web服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利民预售新款刺灵 AS120 EVO 散
- 下一篇: 使用TestNG的弹簧测试支持