Foro sobre Java EE > webServiceContext devuelve Null
Buenas,
De todo el código que has puesto, te falta la parte más importante. Como defines e inicializas el contexto del web service? (variable wsctx).
Por otro lado, me da la sensación de que el header estás utilizando un mecanismo específico de Axis. Puede que te funcione, pero lo suyo sería hacerlo con el standard JAX-WS, con utilizando un SOAPHandler.
Un saludo
Paso todo lo que tengo:
package com.clases;
import java.util.List;
import java.util.Map;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import com.interfaz.ISaludo;
import com.sun.xml.internal.ws.fault.SOAPFaultBuilder;
@WebService(endpointInterface = "com.interfaz.ISaludo")
public class saludo implements ISaludo {
public saludo() {
SOAPFaultBuilder soapFaultBuilder = null;
soapFaultBuilder.captureStackTrace = false;
}
@WebMethod()
public String saludos(String valor) {
// System.setProperty("com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace",
// "false");
WebServiceContext wsctx = null;
MessageContext mctx = wsctx.getMessageContext();
// get detail from request headers
Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
List userList = (List) http_headers.get("Username");
List passList = (List) http_headers.get("Password");
String username = "";
String password = "";
if (userList != null) {
// get username
username = userList.get(0).toString();
}
if (passList != null) {
// get password
password = passList.get(0).toString();
}
// Should validate username and password with database
if (username.equals("diego") && password.equals("123")) {
return "Hello World JAX-WS - Valid User!";
} else {
return "Unknown User!";
}
}
}
------------------------------------------
package com.interfaz;
import java.rmi.RemoteException;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService(name = "ISaludo", targetNamespace = "http://interfaz.com/")
@SOAPBinding(style = Style.RPC)
public interface ISaludo {
@WebMethod String saludos(String valor) ;
}
-------------------------------------------
Buenas,
Tienes que anotarlo así:
@Resource
WebServiceContext wsctx;
Un saludo
Hola,
lo probé como tu me dices pero sigue siendo nulo, no tienes un ejemplo que pueda seguir.
Saludos,
Estoy utilizando soapui, la idea es colocar el username y passsword en la header para que web service valide sobre ese método.
O con test client ws brouser de eclipse colocar en header
<q0:AuthenticationInfo>
<q0:Username>diego</q0:Username>
<q0:Password>123</q0:Password>
</q0:AuthenticationInfo>
para que el web service lo valide.
puede ser que tengo algo mal?
saludos,
No se que tiene que ver eso último con lo que estamos hablando.
Estás desplegando el Web service en un servidor, no? Y puedes ver el wsdl, etc, etc
No has indicado ningún detalle al respecto.
Un saludo
Quizás no me explique bien, pero lo que quiero, es para el SOAP Request Envelope:
1- Que se agregue la parte soapenv:Header(1) de manera dinámica desde la clase main, cuando se ejecuta la clase mail se ve en eltcp/ip monitor en resuest (1).
2- Que mi método tome esos datos de username y password se validen dentro del método.
3- Utilice el saludo.wsdl, con este genere el generate cliente Axis 1.4, tomcat 6. server, dentro
de este se genero el main(2), dentro del main genero los datos de Header para poner username y password.
(1)
SOAP Request Envelope:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<AuthenticationInfo soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0">
<Username>diego</Username>
<Password>123</Password>
</AuthenticationInfo>
</soapenv:Header>
<soapenv:Body>
<saludos xmlns="http://clases.com">
<valor>Seguridad</valor>
</saludos>
</soapenv:Body>
</soapenv:Envelope>
(2)
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SaludoServiceLocator locador = new SaludoServiceLocator();
Saludo servicio = locador.getsaludo();
// add an <AuthenticationInfo> node with a <UserName> subnode
// to the SOAP Header
SOAPHeaderElement header = new SOAPHeaderElement("","AuthenticationInfo");
SOAPElement node = header.addChildElement("Username");
node.addTextNode("diego");
SOAPElement node1 = header.addChildElement("Password");
node1.addTextNode("123");
((Stub) servicio).setHeader(header);
System.out.println(servicio.saludos("Seguridad"));
}
Espero que se entienda.
Saludos.
Ya, pero esto que comentas es totalmente circunstancial. Ese código probablemente es correcto y no da errores (aunque como te comento es mucho más estandar utilizar un SOAPHandler, pero bueno).
Lo realmente importante es:
1-Has desarrollado un Web Service
2-Ese Web Service está desplegado (como?) y su WSDL es públicamente accesible
3-Desde ese Web Service debes leer la cabecera del mensaje SOAP que contiene ciertos datos de seguridad, para validarlos.
4-Para leer la cabecera del mensaje necesitas acceder al WebServiceContext.
5-El WebServiceContext está a null y te da error.
El problema lo tienes en el servidor, que no tiene contexto y hay que ver por qué. El indicar que lo llamas desde Java, SOAPUI, PHP o .NET no nos aporta ninguna información de cara a resolver el problema.
Puedes publicar el código que tienes ahora en el Web Service incluyendo la anotación que te indiqué?
Un saludo
el web service esta deplegado localmente, hasta ahora no esta publico.
La idea que me funcione todo local para luego poder hacerlo publico.
Estoy utilizando toamcat 6 server - local en en mi pc.
En conclusión los que estoy necesitando crear un webservice que contenga la autenticacion en la HEADER. Ya que desde SAP pi necesito agregar los datos de usuario y contraseña en la cabecera para que se pueda ejecutar la operación.
Se entiende?
Gracias por toda la ayuda.
Saludos,
En conclusión los que estoy necesitando crear un webservice que contenga la autenticacion en la HEADER. Ya que desde SAP pi necesito agregar los datos de usuario y contraseña en la cabecera para que se pueda ejecutar la operación.Se entiende?
Por que insistes en repetirme siempre lo mismo?. Que mas da si accedes desde SAP, desde SIP o desde SOP?
La respuesta vuelve a ser exactamente la misma que el mi ultimo post. Por favor, leelo hasta el final, porque no has contestado.
P.D: si, como me empiezo a temer, lo que pasa es que solucionar el error y entender como funciona te da igual y lo esperas es que alguien sea adivino y te envie todo el codigo que necesitas para que hagas copy&paste y todo funcione en tu equipo local, lo siento pero es mejor entonces que postees en el foro de la virgen de Lourdes.
Un saludo
Hola,
Claro, lo que me esta faltando es comprender algunos temas.
1 - SOAPHandler cual es bien su funcionamiento?
2 - seguí un tutorial de la web, que dice que tengo que poner @HandlerChain, genero el xml Handler, pero al poner un debugger no para en el método handleMessage.
3 - para poder modificar el SOAP con SOAPHandler como se llama desde una clase main?
mil disculpas, pero estoy leyendo para tratar de comprender mejor, pero hay cosas que se me escapan.
Mil Gracias.
Saludos,
Buenas,
El SOAPHandler te permite modificar el mensaje SOAP antes de enviarlo. Es perfecto, por tanto, si quieres crear una cabecera e incluir en esta ciertos parámetros.
Aquí tienes una página de IBM con un ejemplo muy bueno:
http://pic.dhe.ibm.com/infocenter/spsscads/v6r0m0/index.jsp?topic=%2Fcom.ibm.spss.cads.ws.overview.doc%2Fpredictive_platform%2Fweb_services%2Fjaxws_clients_soaphandler_ex.html
Para que se utilice ese handler, necesitas establecerlo en tu cliente.
Por ejemplo, para incluir ese handler del ejemplo en tu código:
service.setHandlerResolver(new HandlerResolver()
{
@Override
public List<Handler> getHandlerChain(PortInfo portInfo)
{
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(new SecurityHandler("user", "password", "es-ES;q=1.0, en;q=0.8"));
return handlerChain;
}
});
Desde la parte del Web Service servidor, deberías tener otro Handler que interprete el mensaje entrante y los datos de la cabecera. Dicho handler si que tienes que definirlo con el @HandlerChain.
Pero de cualquier forma, esto del handler es opcional. Lo que estás haciendo con Axis tiene pinta de funcionar, aunque sea una solución específica de Axis.
Te sigues encontrando con el problema al invocar el web service de que no tienes el contexto?
Por todo lo que comentas (ausencia de contexto, no funciona el handlerchain) da la sensación de que el web service se llama localmente (instancias la clase e invocas al método sin mas) y no remotamente. Puede ser el caso?
Un saludo
Hola,
Lo del @HandlerChain del lado del Server ya lo tengo listo, me parece mejor SOAPHandler, quiero entender esta forma.
Igual lo del contexto de axis sigue en null, pero bueno, ya lo voy a sacar jeje.voy a
si me pasan una http://localhost:10476/WebServiceProject/services/saludo por ejemplo, si yo quiero agregarle el header necesito crear el soaphandlers?
voy a seguir buscando info.
gracias por todo, todo lo que me dices me ayuda para buscar mas información
Estoy creando un web service en java, quiero que se agregue autenticacion por HEADER.
código de clase método
MessageContext mctx = wsctx.getMessageContext();
// get detail from request headers
Map http_headers = (Map) mctx
.get(MessageContext.HTTP_REQUEST_HEADERS);
List userList = (List) http_headers.get("Username");
List passList = (List) http_headers.get("Password");
String username = "";
String password = "";
if (userList != null) {
// get username
username = userList.get(0).toString();
}
if (passList != null) {
// get password
password = passList.get(0).toString();
}
// Should validate username and password with database
if (username.equals("diego") && password.equals("123")) {
ivalor = "usuario validos";
return ivalor;
} else {
ivalor = "error de usuario y contraseña";
return ivalor;
}
// return valor;
}else{
ivalor = " error en el contexto";
return ivalor;
}
clase cliente
public static void main(String[] args) throws RemoteException, ServiceException, SOAPException {
// TODO Auto-generated method stub
SaludoServiceLocator locator = new SaludoServiceLocator();
Saludo service = locator.getsaludo();
// add an <AuthenticationInfo> node with a <UserName> subnode
// to the SOAP Header
SOAPHeaderElement header = new SOAPHeaderElement("", "AuthenticationInfo");
SOAPElement node = header.addChildElement("Username");
node.addTextNode("diego");
SOAPElement node1 = header.addChildElement("Password");
node1.addTextNode("123");
((Stub) service).setHeader(header);
System.out.println("prueba: " + service.saludos("nuevo"));
}
}
pero tengo el problema que la clase webServiceContext devuelve Null y no puedo verificar si el usurario y contraseña es la correcta para ese método.
Que puede estar pasando?
SAludos,