jax-rs jax-ws
创建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");
}
@Override
public 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"?>
<endpoints
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
version="2.0">
<endpoint
name="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
jax-rs jax-ws