Статьи

Веб-сервисы с JAX-WS на Tomcat

Предположим, что предприятие поддерживает детали аутентификации пользователей в централизованной системе. Нам нужно создать AuthenticationService, который будет принимать учетные данные, проверять их и возвращать статус. Остальные приложения будут использовать AuthenticationService для аутентификации пользователей.









Создайте интерфейс AuthenticationService следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
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;
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
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
  
}
01
02
03
04
05
06
07
08
09
10
11
12
13
package com.sivalabs.caas.domain;
 
/**
 * @author siva
 *
 */
public class AuthenticationStatus
{
 private String statusMessage;
 private boolean success;
 //setters and getters
  
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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);
 }
}

Теперь давайте реализуем службу аутентификации.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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",
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. В реальных приложениях эта проверка будет выполняться для базы данных.

Теперь мы собираемся опубликовать веб-сервис.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
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.

Теперь давайте создадим автономный тестовый клиент для тестирования веб-сервиса.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
 {
  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.

Инструмент wsimport находится в каталоге JDK / bin.

Перейдите в каталог src вашего проекта и выполните следующую команду.

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

Он сгенерирует следующие файлы java и class в пакете com.sivalabs.caas.client.

Authenticate.java
AuthenticateResponse.java
AuthenticationService_Service.java
AuthenticationService.java
AuthenticationServiceException_Exception.java
AuthenticationServiceException.java
AuthenticationStatus.java
Credentials.java
ObjectFactory.java
package-info.java

Теперь вы можете использовать сгенерированные файлы Java для тестирования Сервиса.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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());
}

Теперь мы посмотрим, как развернуть JAX-WS WebService на сервере Tomcat.

Мы собираемся развернуть Службу аутентификации, разработанную в http://sivalabs.blogspot.com/2011/09/developing-webservices-using-jax-ws.html, на apache-tomcat-6.0.32.

Для развертывания нашего AuthenticationService нам нужно добавить следующую конфигурацию.

1.web.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<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

01
02
03
04
05
06
07
08
09
10
11
<?xml version="1.0" encoding="UTF-8"?>
<endpoints
  version="2.0">
   
  <endpoint
      name="AuthenticationService"
      implementation="com.sivalabs.caas.services.AuthenticationServiceImpl"
      url-pattern="/services/AuthenticationService"/>
       
</endpoints>

3. Загрузите эталонную реализацию JAX-WS с http://jax-ws.java.net/

Скопируйте все файлы jar из папки jaxws-ri / lib в WEB-INF / lib.

Теперь разверните приложение на сервере Tomcat.
Вам не нужно публиковать Сервис самостоятельно, как мы это делали с помощью EndpointPublisher.
Как только tomcat запущен и работает, посмотрите сгенерированный wsdl по адресу http: // localhost: 8080 / CAAS / services / AuthenticationService? Wsdl.

Теперь, если вы протестируете AuthenticationService с помощью автономного клиента, он будет работать нормально.

01
02
03
04
05
06
07
08
09
10
11
12
public static void testAuthenticationService()throws Exception
{
  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-файлов в classpath-клиенте.

В противном случае вы получите следующую ошибку:

1
2
3
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)

Ссылка: Разработка веб-сервисов с использованием JAX-WS и развертывание JAX-WS WebService на Tomcat-6 от нашего партнера по JCG Шивы Редди в блоге « Мои эксперименты по технологии» .