Manipular mensaje de jabón como una cadena

¿Es posible manipular un mensaje SOAP generado por Jax-WS como una cadena antes de enviarlo al servidor? Me gustaría interceptar el mensaje exactamente antes de enviarlo y modificar algunas etiquetas.

Quiero hacer esto porque necesito enviar una solicitud SOAP al servidor. Una etiqueta de esta solicitud tiene muchos documentos xml como contenido. Para cada documento, necesito volver a declarar el espacio de nombres en algunas etiquetas (Jax-WS lo declara de manera inteligente solo una vez). No puedo usar ningún prefijo. Necesito firmar el xml también. Todos estos problemas serían más fáciles de resolver si pudiera manipular el mensaje como una cadena.

He visto algo similar con el eje, pero no descubrí cómo hacer esto con Jax-WS.

Gracias.

Actualización: ya he intentado utilizar controladores (controladores SOAP y lógicos). Mi problema es que Jax-WS cambia el mensaje incluso después de modificarlo con los controladores. El cuerpo de mi mensaje de jabón tiene que verse así:

<soap12:Body>
  <cteDadosMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteRecepcao">
      <enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="1.04">
         <idLote>1</idLote>
         <CTe  xmlns="http://www.portalfiscal.inf.br/cte">
         </CTe>
         <CTe  xmlns="http://www.portalfiscal.inf.br/cte">
         </CTe>
      </enviCTe>
   </cteDadosMsg>
</soap12:Body>

Observe que mis etiquetas CTe necesitan repetir la declaración del espacio de nombres (lo mismo que enviCTe). Traté de hacer los siguientes pasos:

1) Creó el documento que contiene el enviCTe usando Jaxb.

2) Lo convirtió en cadena y ajustó la declaración de espacio de nombres de las etiquetas CTe (usando String.replace).

3) Se agregó la cadena xml a cteDadosMsg. Jax-WS escapa a los caracteres (reemplazando < &lt;por ejemplo). El servicio web no entiende el xml con los caracteres escapados.

4) Se agregó un LogicalHandler para eliminar la carga útil (reemplazando &lt;por <y así sucesivamente).

5) Después de hacer esto, Jax-WS ajusta la declaración del espacio de nombres nuevamente y el atributo xmlns de mis etiquetas CTe desaparece. : P Ese es mi problema. Jax-WS "repara" el mensaje incluso después de modificarlo con los manejadores.

En lugar de agregar el xml generado por Jaxb como una cadena, también traté de agregarlo como un documento. No tengo problemas para escapar, pero todavía no puedo repetir la declaración del espacio de nombres para cada etiqueta CTe. Cuando resuelva esto, aún tendré que firmar algunas etiquetas del xml. Así que realmente me gustaría interceptar el mensaje justo antes de enviarlo y modificarlo como una cadena. ¿Me estoy perdiendo de algo?

Respuesta 1

Acabo de hacer un programa que se supone que escanea un archivo y cuenta el número de líneas, vocales y muchas otras cosas, pero cuando lo ejecuto, entra en un bucle infinito. Estoy bastante seguro de que tiene que ver ...

En Linux, desde la línea de comandos, estoy ejecutando un script ant para construir un proyecto java. Yo uso JasperReports en el ejercicio. Pero mi pregunta es general. Me sale un error de compilación: paquete net.sf ...

¿Cómo puedo analizar este JSON incorrecto (creo) usando la biblioteca Gson? {...... "teléfonos": {"155193": "5556739386", "155194": "5555301828"} ......} ...

Aquí, estoy tratando de pasar el argumento lambda a la invocación local de un método que acepta el argumento lambda: package Desktop; import java.util.function. *; clase pública MyClass {public static <...