Создайте интерфейс 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;@WebServicepublic 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 Шивы Редди в блоге « Мои эксперименты по технологии» .