Tomcat上具有JAX-WS的Web服务

让我们假设一家企业正在一个集中式系统中维护用户身份验证详细信息。 我们需要创建一个AuthenticationService,它将获取凭据,对其进行验证并返回状态。 其余的应用程序将使用AuthenticationService对用户进行身份验证。







创建AuthenticationService接口,如下所示:

package com.sivalabs.caas.services;
import javax.jws.WebService;import com.sivalabs.caas.domain.AuthenticationStatus;
import com.sivalabs.caas.domain.Credentials;
import com.sivalabs.caas.exceptions.AuthenticationServiceException;@WebService
public interface AuthenticationService
{
public AuthenticationStatus authenticate(Credentials credentials) throws AuthenticationServiceException;
}
package com.sivalabs.caas.domain;
/*** @author siva**/
public class Credentials 
{private String userName;private String password;public Credentials() 
{}public Credentials(String userName, String password) {super();this.userName = userName;this.password = password;}//setters and getters}
package com.sivalabs.caas.domain;/*** @author siva**/
public class AuthenticationStatus
{private String statusMessage;private boolean success;//setters and getters}
package com.sivalabs.caas.exceptions;/*** @author siva**/
public class AuthenticationServiceException extends RuntimeException
{private static final long serialVersionUID = 1L;public AuthenticationServiceException(){}public AuthenticationServiceException(String msg){super(msg);}
}

现在让我们实现AuthenticationService。

package com.sivalabs.caas.services;import java.util.HashMap;
import java.util.Map;import javax.jws.WebService;import com.sivalabs.caas.domain.AuthenticationStatus;
import com.sivalabs.caas.domain.Credentials;
import com.sivalabs.caas.exceptions.AuthenticationServiceException;/*** @author siva**/
@WebService(endpointInterface="com.sivalabs.caas.services.AuthenticationService",serviceName="AuthenticationService", targetNamespace="http://sivalabs.blogspot.com/services/AuthenticationService")
public class AuthenticationServiceImpl implements AuthenticationService
{private static final Map<string, string> CREDENTIALS = new HashMap<string, string>();static{CREDENTIALS.put("admin", "admin");CREDENTIALS.put("test", "test");  }@Overridepublic AuthenticationStatus authenticate(Credentials credentials) throws AuthenticationServiceException{if(credentials == null){throw new AuthenticationServiceException("Credentials is null");}AuthenticationStatus authenticationStatus = new AuthenticationStatus();String userName = credentials.getUserName();String password = credentials.getPassword();if(userName==null || userName.trim().length()==0 || password==null || password.trim().length()==0){authenticationStatus.setStatusMessage("UserName and Password should not be blank");authenticationStatus.setSuccess(false);}else{if(CREDENTIALS.containsKey(userName) && password.equals(CREDENTIALS.get(userName))){authenticationStatus.setStatusMessage("Valid UserName and Password");authenticationStatus.setSuccess(true);}else{authenticationStatus.setStatusMessage("Invalid UserName and Password");authenticationStatus.setSuccess(false);}}return authenticationStatus;}
}

为了简单起见,我们在此针对存储在HashMap中的静态数据检查凭据。 在实际的应用程序中,将针对数据库执行此检查。

现在,我们将发布WebService。

package com.sivalabs.caas.publisher;import javax.xml.ws.Endpoint;import com.sivalabs.caas.services.AuthenticationServiceImpl;public class EndpointPublisher
{public static void main(String[] args){Endpoint.publish("http://localhost:8080/CAAS/services/AuthenticationService", new AuthenticationServiceImpl());}}

运行此独立的类以发布AuthenticationService。

要检查服务是否已成功发布,请将浏览器指向URL http:// localhost:8080 / CAAS / services / AuthenticationService?wsdl。 如果服务成功发布,您将看到WSDL内容。

现在,让我们创建一个独立测试客户端来测试Web服务。

package com.sivalabs.caas.client;import java.net.URL;import javax.xml.namespace.QName;
import javax.xml.ws.Service;import com.sivalabs.caas.domain.AuthenticationStatus;
import com.sivalabs.caas.domain.Credentials;
import com.sivalabs.caas.services.AuthenticationService;/*** @author siva**/
public class StandaloneClient
{public static void main(String[] args) throws Exception{URL wsdlUrl = new URL("http://localhost:8080/CAAS/services/AuthenticationService?wsdl");QName qName = new QName("http://sivalabs.blogspot.com/services/AuthenticationService", "AuthenticationService");Service service = Service.create(wsdlUrl,qName);AuthenticationService port = service.getPort(AuthenticationService.class);Credentials credentials=new Credentials();credentials.setUserName("admin1");credentials.setPassword("admin");AuthenticationStatus authenticationStatus = port.authenticate(credentials);System.out.println(authenticationStatus.getStatusMessage());credentials.setUserName("admin");credentials.setPassword("admin");authenticationStatus = port.authenticate(credentials);System.out.println(authenticationStatus.getStatusMessage());}}

不用我们自己编写StandaloneClient,我们可以使用wsimport命令行工具生成Client。

wsimport工具在JDK / bin目录中。

转到您的项目src目录并执行以下命令。

wsimport -keep -p com.sivalabs.caas.client http:// localhost:8080 / CAAS / services / AuthenticationService?wsdl

它将在com.sivalabs.caas.client软件包中生成以下Java和类文件。

Authenticate.java
AuthenticateResponse.java
AuthenticationService_Service.java AuthenticationService.java AuthenticationServiceException_Exception.java AuthenticationServiceException.java AuthenticationStatus.java Credentials.java ObjectFactory.java 包信息.java

现在,您可以使用生成的Java文件来测试服务。

public static void main(String[] args) throws Exception
{AuthenticationService_Service service = new AuthenticationService_Service();com.sivalabs.caas.client.AuthenticationService authenticationServiceImplPort = service.getAuthenticationServiceImplPort();com.sivalabs.caas.client.Credentials credentials = new com.sivalabs.caas.client.Credentials();credentials.setUserName("admin1");credentials.setPassword("admin");com.sivalabs.caas.client.AuthenticationStatus authenticationStatus = authenticationServiceImplPort.authenticate(credentials);System.out.println(authenticationStatus.getStatusMessage());credentials.setUserName("admin");credentials.setPassword("admin");authenticationStatus = authenticationServiceImplPort.authenticate(credentials);System.out.println(authenticationStatus.getStatusMessage());
}

现在,我们将看到如何在Tomcat服务器上部署JAX-WS WebService。

我们将在apache-tomcat-6.0.32上部署在http://sivalabs.blogspot.com/2011/09/developing-webservices-using-jax-ws.html中开发的AuthenticationService。

要部署我们的AuthenticationService,我们需要添加以下配置。

1.web.xml

<web-app><listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class></listener><servlet><servlet-name>authenticationService</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>authenticationService</servlet-name><url-pattern>/services/AuthenticationService</url-pattern></servlet-mapping>
</web-app>

2.创建一个新文件WEB-INF / sun-jax-ws.xml

<?xml version="1.0" encoding="UTF-8"?>
<endpointsxmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"version="2.0"><endpointname="AuthenticationService"implementation="com.sivalabs.caas.services.AuthenticationServiceImpl"url-pattern="/services/AuthenticationService"/></endpoints>

3.从http://jax-ws.java.net/下载JAX-WS参考实现。

将所有jar文件从jaxws-ri / lib文件夹复制到WEB-INF / lib。

现在,将应用程序部署在Tomcat服务器上。
您不需要像使用EndpointPublisher那样由我们自己发布服务。
Tomcat启动并运行后,请在http:// localhost:8080 / CAAS / services / AuthenticationService?wsdl中查看生成的wsdl。

现在,如果您使用独立客户端测试AuthenticationService,它将可以正常工作。

public static void testAuthenticationService()throws Exception
{URL wsdlUrl = new URL("http://localhost:8080/CAAS/services/AuthenticationService?wsdl");QName qName = new QName("http://sivalabs.blogspot.com/services/AuthenticationService", "AuthenticationService");Service service = Service.create(wsdlUrl,qName);AuthenticationService port = service.getPort(AuthenticationService.class);Credentials credentials=new Credentials();credentials.setUserName("admin");credentials.setPassword("admin");AuthenticationStatus authenticationStatus = port.authenticate(credentials);System.out.println(authenticationStatus.getStatusMessage());
}

但是,如果尝试使用wsimport工具生成的客户端代码进行测试,请确保在客户端类路径中没有jax-ws-ri jar。

否则,您将得到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: javax.xml.ws.WebFault.messageName()Ljava/lang/String;at com.sun.xml.ws.model.RuntimeModeler.processExceptions(RuntimeModeler.java:1162)at com.sun.xml.ws.model.RuntimeModeler.processDocWrappedMethod(RuntimeModeler.java:898)

参考: “ 我的实验”博客上的 JCG合作伙伴 Siva Reddy提供了使用JAX-WS开发WebServices和在Tomcat-6上部署JAX-WS WebService的信息 。


翻译自: https://www.javacodegeeks.com/2012/03/web-services-with-jax-ws-on-tomcat.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python的下载及安装

1、官网下载地址&#xff1a;https://www.python.org/downloads/ 2、python设置环境变量&#xff1a; 在系统变量里添加Python的安装位置 3、在cmd里输入python里即可转载于:https://www.cnblogs.com/fun0623/p/5257573.html

MongoDB 字段拼接 $concat(aggregation)

$concat 拼接字符串操作&#xff0c;返回拼接后的字符串。语法格式如下&#xff1a; { $concat: [ <expression1>, <expression2>, ... ] }参数可以是任何有效的表达式&#xff0c;只要它们解析为字符串即可。 有关表达式的更多信息&#xff0c;请参阅表达式。 示…

cmake mysql 编译参数_Cmake-MySQL编译参数说明

Cmake-MySQL编译参数说明(来源于MySQL官方手册)https://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.htmlFormats Description DefaultIntroduced Removed ##格式描述默认导入删除BUILD_CONFIG Use same build options as official releases ##b使用相同…

动态给H5页面绑定数据,基本万能无错误!

此为原创&#xff0c;转载请注明出处&#xff01; /* * 共通用绑定页面数据用方法 * * param bingData 需要绑定的数据 * * return 无 * */function commonBindData(bingData) { // 取得需绑定的json数据 var jsonArray eval("(" bingData ")"); // …

c语言函数---M

书画小说软件 制作更满意的读、更舒心的写、更轻松的公布最全古典小说网 由本软件公布所得main()主函数 每一C 程序都必须有一main()函数, 能够依据自己的爱好把它放在程序的某 个地方。有些程序猿把它放在最前面, 而还有一些程序猿把它放在最后面, 不管放 在哪个地方, 下面几…

使用Apache ActiveMQ的JMS开发基础

去年是我尝试JMS的时候。 背后的想法和概念让我有些困惑&#xff0c;但是当我知道它的用途后&#xff0c;我很快就掌握了它。 在本文中&#xff0c;我将展示使用Apache ActiveMQ作为后端使用Java开发简单的生产者/消费者的基础。 让我们首先从概念开始&#xff0c;这是一个简单…

vijos p1460——拉力赛

描述 车展结束后&#xff0c;游乐园决定举办一次盛大的山道拉力赛&#xff0c;平平和韵韵自然也要来参加大赛。 赛场上共有n个连通的计时点&#xff0c;n-1条赛道&#xff08;构成了一棵树&#xff09;。每个计时点的高度都不相同&#xff08;父结点的高度必然大于子结点&#…

mysql acid_Mysql中ACID的原理

原子性 (Atomicity)原子性是指一个事务是一个不可分割的工作单位&#xff0c;其中的操作要么都做&#xff0c;要么都不做。隔离性 (Isolation)隔离性是指多个事务并发执行的时候&#xff0c;事务内部的操作与其他事务是隔离的&#xff0c;并发执行的各个事务之间不能互相干扰…

MongoDB 自动删除集合中过期的数据——TTL索引

简介 ​ TTL (Time To Live, 有生命周期的) 索引是特殊单字段索引&#xff0c;MongoDB可以用来在一定时间后自动从集合中删除文档的特殊索引。 这对于某些类型的数据非常好&#xff0c;例如机器生成的事件数据&#xff0c;日志和会话信息&#xff0c;这些信息只需要在数据库中…

PLSQL 经常自动断开失去连接的解决过程

问题背景&#xff1a; 情况是这样的&#xff0c;很多开发同事的PLSQL上班时间开着8个小时&#xff0c;有时候他们出去抽烟后或者中午吃完饭&#xff0c;回来在PLSQL上面执行就报错无响应&#xff0c;然后卡住了半天动弹不了&#xff0c;非得重新登录plsql才生效&#xff0c;我猜…

使用Cobertura,JUnit,HSQLDB,JPA涵盖您的测试

你好&#xff01;你好吗&#xff1f; 今天让我们谈谈一个非常有用的工具&#xff0c;名为“ Cobertura”。 该框架与我们在另一篇文章中看到的Emma框架具有相同的功能。 Cobertura和Emma之间的主要区别在于Cobertura显示带有图形的简历页面。 如果要查看有关该主题的其他主题…

fedora mysql gui_fedora8安装 mysql++失败!!装了一个晚上没搞定!!伤心阿!

fedora8安装 mysql失败&#xff01;&#xff01;装了一个晚上没搞定&#xff01;&#xff01;伤心阿&#xff01;发布时间:2008-02-24 05:15:27来源:红联作者:lygzx[rootF8 mysql-3.0.0]# ./configure --w/usr/lib/mysqlconfigure: error: unrecognized option: --w/usr/lib/my…

MongoDB 数组类型查询 —— $elemMatch 操作符

描述 $elemMatch 数组查询操作用于查询数组值中至少有一个能完全匹配所有的查询条件的文档。语法格式如下&#xff1a; { <field>: { $elemMatch: { <query1>, <query2>, ... } } }如果只有一个查询条件就没必要使用 $elemMatch。 限制 不能指定 $where 查…

MVC4 Action 方法的执行

1. ActionInvoker 的执行&#xff1a; 在MVC 中 包括Model绑定与验证在内的整个Action的执行是通过一个名为ActionInvoker的组件来完成的。 它同样具有 同步/异步两个版本。 分别实现了接口 IActionInvoker /IAsyncActionInvoker。 ASP.NET MVC 中真正用于Action方法同步和异步…

C# 基础知识总结

要学好C#&#xff0c;基础知识的重要性不言而喻&#xff0c;现将常用到的一些基础进行总结&#xff0c;总结如下&#xff1a; 01. 数据类型转换&#xff1a; 强制类型转换(Chart--> int): char crA; int i (int)(cr); 02. 委托/匿名函数/Lamda表达式&#xff1a; 委托是匿…

Java注释和真实世界的Spring示例

“注释”是编程语言定义的一种&#xff0c;用作“标记”。 可以将它们视为编程语言引擎可以理解的注释行。 它们不会直接影响程序的执行&#xff0c;但是会在需要时间接影响。 定义 注释使用interface关键字定义&#xff0c;并且与接口相似。 它具有定义类似于接口方法的属性。…

scrapy+mysql+pipeline+更新数据_python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)...

前言保存本地存储Json数据配置setting保存数据库创建数据库创建表编写pipelines配置setting本文是对上篇文章所讲的代码进一步优化&#xff0c;回看可以点这里&#xff0c;代码就直接在上一篇代码中进行改造&#xff0c;没有的小伙伴可以在这里下载。前言Scrapy 提供了 pipelin…

NYOJ 44 子串和

子串和 时间限制&#xff1a;5000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述 给定一整型数列{a1,a2...,an}&#xff0c;找出连续非空子串{ax,ax1,...,ay}&#xff0c;使得该子序列的和最大&#xff0c;其中&#xff0c;1<x<y<n。 输入 第一行是一个…

学习进度条

学习进度条 周次 学习时间 新编写代码行数 博客量&#xff08;篇&#xff09; 学到知识点 第一周 160 0 1 github的使用和认识软件工程这门课的价值。 第二周 160 130 3 复利的计算和Github的一些简单操作还有就是进行项目的开发分析&#xff0c;还有就是对…

ARM基础

1.  将32位a的【7&#xff1a;4】改成0101 -> a a&(~(0xF << 4)) | (0x5 << 4)&#xff1b; 2.  32位&#xff1a;单次处理数据32位。 3.  对于CPU而言&#xff0c;一切皆内存&#xff1b; 4.  DMA总线&#xff1a;不经过CPU直接在内存和内存间交换…