2010-10-13 14 views
6

Estoy usando la API de Axis para acceder al servidor HTTP de Axis. La documentación de la API se puede encontrar here.Controlador para agregar encabezados HTTP a la solicitud HTTP no invocada al utilizar la API de cliente de Axis

Estoy usando el siguiente código para agregar controladores al servidor. service es de tipo java.xml.rpc.Service

HandlerRegistry registry = service.getHandlerRegistry(); 
    QName serviceName = new QName(url, "MyServiceClass"); 

    List<HandlerInfo> handlerChain = new ArrayList<HandlerInfo>(); 
    HandlerInfo handlerInfo = new HandlerInfo(MyHandler.class, null, null); 
    handlerChain.add(handlerInfo); 
    registry.setHandlerChain(serviceName, handlerChain); 

sé que el nombre del servicio es correcto que estoy recibiendo la salida correcta en llamadas posteriores al objeto de servicio.

De alguna manera, el controlador no se está invocando. Aquí está la clase de Handler. Mi intención es agregar encabezados personalizados a la solicitud HTTP antes de reenviar la solicitud al servidor.

import javax.xml.namespace.QName; 
import org.apache.axis.AxisFault; 
import org.apache.axis.MessageContext; 
import org.apache.axis.handlers.BasicHandler; 

public class MyHandler extends BasicHandler { 

    @Override 
    public void init() { 
     System.out.println("init called"); 
     super.init(); 
     System.out.println("init called"); 
    } 

    @Override 
    public void cleanup() { 
     super.cleanup(); 
     System.out.println("cleanup called"); 
    } 

    @Override 
    public void invoke(MessageContext mc) throws AxisFault { 
     System.out.println("invoke called"); 
    } 

    public QName[] getHeaders() { 
     System.out.println("getHeaders"); 
     return new QName[1]; 
    } 
} 

¿Qué problema hay en el código anterior?

¿Hay alguna otra forma de modificar los encabezados HTTP utilizando la API de Apache Axis?

Respuesta

7

Okie. Esto debería hacer el truco:

1 - Crear un archivo wsdd (digamos /tmp/test.wsdd) que contiene lo siguiente:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 
<handler name="test" type="java:axistest.TestHandler" /> 
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"> 
    <requestFlow> 
    <handler type="test"/> 
    </requestFlow> 
</transport> 
</deployment> 

2 - Asegurar todos los ejes bibliotecas están en la ruta de clase y luego ejecutar:

java org.apache.axis.utils.Admin client /tmp/test.wsdd 

3 - El paso 2 generará un client-config.wsdd. Copie esto en su proyecto y asegúrese de que esté en la ruta de clase cuando se ejecute el proyecto.

4 - TODAS las llamadas de servicio web (a través de transporte HTTP) encaminará a través de la clase TestHandler1

Aquí está mi clase TestHandler1 (una ligera modificación del ur controlador para acceder a las cabeceras MIME):

package axistest; 

import javax.xml.namespace.QName; 
import javax.xml.soap.MimeHeaders; 
import org.apache.axis.AxisFault; 
import org.apache.axis.MessageContext; 
import org.apache.axis.handlers.BasicHandler; 

public class TestHandler1 extends BasicHandler { 

@Override 
public void init() { 
    System.out.println("init called"); 
    super.init(); 
    System.out.println("init called"); 
} 

@Override 
public void cleanup() { 
    super.cleanup(); 
    System.out.println("cleanup called"); 
} 

@Override 
public void invoke(MessageContext mc) throws AxisFault { 
    System.out.println("invoke called"); 
    System.out.println("=----------------------------------="); 
    MimeHeaders mimeHeaders = mc.getMessage().getMimeHeaders(); 
    mimeHeaders.addHeader("X-Test", "Hello"); 
    System.out.println("Headers : \n " + mimeHeaders); 
} 

public QName[] getHeaders() { 
    System.out.println("getHeaders"); 
    return new QName[1]; 
} 

} 

cuando ejecuto esto en mi caja, veo que se invocan estos métodos de controlador:

- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled. 
init called 
init called 
invoke called 
=----------------------------------= 
Headers : 
[email protected] 
. 
. 
. 
+0

esto funciona para mí. Hubo algún problema con mi client-config.wsdd. Afortunadamente, esta herramienta genera el archivo correcto. –

+0

¡Está funcionando para mí! ¡Gracias! – jilt3d

0

Estamos agregando encabezados personalizados a una solicitud SOAP. Sin embargo, hemos implementado esto al inyectar los encabezados en el objeto Axis Stub para el servicio web en tiempo de ejecución. Por lo tanto, no cambian para cada solicitud, pero los encabezados inyectados se usan para la ejecución completa de nuestros casos de prueba

Si cree que ese es su caso de uso, puedo encontrar ese código y actualizar con lo que hicimos.

+0

Necesito agregar encabezados HTTP y no encabezados SOAP. –

+0

Lo siento :(. Sin embargo, hice una búsqueda para encontrar esto. Compruebe si ayuda: http://faq.javaranch.com/java/WebServicesHowTo#http-headers – madhurtanwani

+0

tratando de llamar a la función setProperty en el objeto de código auxiliar. No funciona. ¿Puede darme el fragmento de código que está usando? Gracias –

Cuestiones relacionadas