Vamos a generar las clases necesarias para generar un cliente de un Web Service a partir de su WSDL.
Nos basaremos en el proyecto HelloWorld de hace unas semanas, y aquà le añadimos seguridad. En este proyecto devolvÃamos el saludo según el nombre que nos pasaban como parámetro a través del Web Service.
Read the rest of this entry »
Queremos interceptar el WS en la salida y la entrada. Esto puede ser útil para:
- Hacer log de alguna parte del mensaje
- Llevar registro de mensajes enviados
- Controles de seguridad añadidos
- ….
Hoy vamos a hacer un ejemplo de log de la entrada/salida del WS.
Anotamos el WS con el descriptor de la cadena de manejadores:
@WebService
@HandlerChain(file="src/META-INF/handlerChain.xml")
public class Hello {
@WebMethod
public String sayHello(String name) {
return "Hello, "+name+".";
}
}
Que tendrá el contenido siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-class>lebrijo.handlers.WSHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
La clase WSHandler implementará la interfaz SOAPHandler:
public class WSHandler implements SOAPHandler<SOAPMessageContext> {
public Set<QName> getHeaders() {
return null;
}
public boolean handleFault(SOAPMessageContext context) {
logToSystemOut(context);
return true;
}
public boolean handleMessage(SOAPMessageContext context) {
logToSystemOut(context);
return true;
}
private void logToSystemOut(SOAPMessageContext smc) {
Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
System.out.println("\nOutgoing message:");
} else {
System.out.println("\nIncoming message:");
}
SOAPMessage message = smc.getMessage();
try {
message.writeTo(System.out);
} catch (Exception e) {
System.out.println("Exception in handler: " + e);
}
}
public void close(MessageContext context) {
// TODO Auto-generated method stub
}
Para el post de hoy vamos a ver como se asegura un Servicio Web con HTTP Auth, básica, en Weblogic. Para ello nos podemos basar en un proyecto anterior en el que creamos un WS muy básico: Hello World.
En el Security Realm > MyRealm tenemos que crear:
- Usuario: user/12345678
- Grupo: TutorialUser
- Añadir el usuario al grupo
En la consola de Weblogic, como vemos en la figura:

En el web.xml hay que añadir la configuración de seguridad pertinente (path, tipo básico,….):
<!--
SECURITY
-->
<security-constraint>
<display-name>Regla01</display-name>
<web-resource-collection>
<web-resource-name>WSPOST</web-resource-name>
<description />
<url-pattern>/*</url-pattern>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>TutorialUser</role-name>
</auth-constraint>
</security-constraint>
<session-config>
<session-timeout>5</session-timeout>
</session-config>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>myrealm</realm-name>
</login-config>
<security-role>
<description />
<role-name>TutorialUser</role-name>
</security-role>
Y en el weblogic.xml mapeamos con el rol (si no hacemos esto no funcionará):
<wls:security-role-assignment>
<wls:role-name>TutorialUser</wls:role-name>
<wls:principal-name>TutorialUser</wls:principal-name>
</wls:security-role-assignment>
Podemos probarlo con SoapUI creando un nuevo proyecto de WS, con la dirección del WSDL (http://localhost:7001/wsc/HelloService?WSDL) y las credenciales creadas en WebLogic anteriormente:

Hoy crearemos un servicio web SOAP, basándonos en el proyecto LebrijoSchool que hemos venido haciendo sobre la arquitectura Oracle-Weblogic en artÃculos anteriores.
Lo primero es añadir el facet de Web Services. Botón derecho > Properties … :

Después, creamos el WS a partir de una clase de servicio de Spring. Botón derecho > New > WebLogic Web Service for Spring Beans:

Elegimos el servicio, y los métodos que queremos publicar publicar como WS.
Finalmente lo ponemos en el paquete adecuado: lebrijo.school.webservices. Y le damos un nombre “SchoolCertificatesWS”.
Nos queda un WS con este código:
@Autowired
@Qualifier("RegistryService")
private IRegistryService springServ;
@WebMethod
public Registry findRegistryById(java.lang.String id) throws Exception {
return springServ.findRegistryById( id );
}
Para ver como funciona en WS tenemos un cliente en Weblogic, al que podemos acceder a través de la URL http://localhost:7001/wls_utc/.
Hoy vamos a crear un WS que diga Hola sobre Weblogic con su ditribución de Eclipse OEPE.
Creamos Nuevo proyecto > Web Service Project:

Hemos creado la siguiente clase:
package services;import javax.jws.*;
@WebService
public class Hello {
@WebMethod
 public String sayHello(String name) {
 return "Hello, "+name+".";
 }
}
Con estas dos anotaciones podemos servir el WS, con botón derecho sobre la clases y Run as > Run on Server. Con esto aparece la interfaz de test en el navegador del WS:

Para acceder al WSDL: http://localhost:7001/wsc/HelloService?WSDL
Para hacer test de cualquier WSDL publicado: http://localhost:7001/wls_utc/begin.do