Spring WS con Axiom: JAXB está incorporando archivos adjuntos MTOM

Tengo servicios web para recibir y enviar archivos adjuntos, y me gustaría usar JAXB como agente de cómputo, pero hasta el momento no está funcionando correctamente, ya que JAXB inscribe cualquier archivo adjunto que entra o sale en el cuerpo del mensaje como cadenas base64, y consume mucho de memoria y con frecuencia lleva a OutOfMemoryError. Estoy describiendo mi configuración y arreglos, y espero que alguien me ayude a hacerlo bien.

Axiom es mi elección sobre SAAJ como fábrica de mensajes, ya que tengo que manejar grandes archivos adjuntos. Puedo usar JAXB como agente de clasificación para parámetros y tipos de retorno de métodos de punto final, excepto cuando se trata de un archivo adjunto (problema en línea). Esta es mi configuración para ello:

Configuración de servicios web XML:

<beans xmlns=...>

    <context:component-scan base-package="com.example.webservice" />

    <sws:annotation-driven />

    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>com.example.webservice.oxm.FileTestResponse</value>
                <value>com.example.webservice.oxm.FileTestRequest</value>
            </list>
        </property>
        <property name="mtomEnabled" value="true"/>
    </bean>

    <bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
        <property name="payloadCaching" value="true"/>
        <property name="attachmentCaching" value="true"/>
    </bean>

    <sws:dynamic-wsdl id="fileTest" portTypeName="fileTest" locationUri="/webservice/fileTest/" targetNamespace="http://example.com/webservice/definitions" >
        <sws:xsd location="/WEB-INF/fileTest.xsd" />
    </sws:dynamic-wsdl>

</beans>

Parte de mi XSD:

<!-- I generate the marshalling classes with XJB, and using
    xmime:expectedContentTypes it correctly creates mtomData field
    with DataHandler type instead of byte[] -->
<xs:element name="fileTestRequest">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="mtomData" type="xs:base64Binary"
                xmime:expectedContentTypes="application/octet-stream"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Mi clase de punto final:

package com.example.webservice;

import ...

@Endpoint
@Namespace(prefix = "s", uri = FileTestEndpoint.NAMESPACE)
public class FileTestEndpoint {

    public static final String NAMESPACE = "http://example.com/webservice/schemas";

    @PayloadRoot(localPart = "fileTestRequest", namespace = NAMESPACE)
    @ResponsePayload
    public FileTestResponse fileTest(@RequestPayload FileTestRequest req) throws IOException {
        // req.getMtomData() and do something with it
        FileTestResponse resp = new FileTestResponse();
        DataHandler dataHandler = new DataHandler(new ByteArrayDataSource("my file download data".getBytes(), "text/plain"));
        resp.setData(dataHandler);
        return resp;
    }
}

Entonces, este código funciona, pero no como lo haría con los archivos adjuntos. Estoy buscando un tiempo para una solución de trabajo:

Foros de primavera: ¿manejo correcto de MTOM? : sugiere extender algunas clases de Axiom, pero el código cambió considerablemente desde (2008), y no pude hacerlo funcionar;Foros de primavera: Respuesta-Adjunto / Saaj / Jaxb : posible causa por un error de JVM corregido en 1.6u14, que es el utilizado por mi versión de Weblogic (además de que no funcionó para el creador del tema);Foros de primavera: envío de archivos adjuntos grandes con el cliente Spring-WS : alguien resolvió usando Axis2 directamente evitando Spring WS, que no es el punto;Stackoverflow: Spring-WS webservice con MTOM adjementement - Hello world test : mismo problema que el mío, 2 semanas de edad, sin respuestas;

Aparentemente la mejor ayuda vino deesta otra pregunta SO Publiqué sobre este problema de alineación que sucedió con WSS4J. Blaise Doughan dijo que necesitaríaAttachmentMarshaller yAttachmentUnmarshaller configurar en (un) marshaller para que sea manejado adecuadamente,como él publicó en su blog.

Por lo tanto, asumo que los comisionados de apego son la clave para resolver este problema.

Para establecerlos en el (un) marshaller, no vi otra manera sino extenderJaxb2Marshaller y overideinitJaxbMarshaller yinitJaxbUnmarshaller, estableciendo comisarios de adjuntos (yo copié el código de Doughan para ellos) en el (no) coordinador dado.

Pero mi propiaJaxb2Marshaller no se está utilizando, ni siquiera cuando se configura manualmentesws:annotation-driven:

<sws:annotation-driven marshaller="jaxb2Marshaller" unmarshaller="jaxb2Marshaller"/>

<bean id="jaxb2Marshaller" class="com.example.webservice.MyJaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.example.webservice.oxm.FileTestResponse</value>
            <value>com.example.webservice.oxm.FileTestRequest</value>
        </list>
    </property>
    <property name="mtomEnabled" value="true"/>
</bean>

Esta clase de marshaller está creada pero nunca se usa, no sé por qué, así que todavía no pude probar siAttachmentMarshallers puede resolver el problema.

Esto es todo lo que puedo decir por ahora. Hay bastantes enfoques para probar:

averigua porqueMyJaxb2Marshaller Se está ignorando, probablemente lo más fácil;arreglar el archivo JAXB insertando de otra manera siAttachmentMarshallers no lo resolverá, y no sé qué sería eso;Reemplace JAXB con otro contador de referencias, que funciona igual de bien (principalmente soporte Axiom, posiblemente WSS4J).

Tengo un largo tiempo en este tema, y ​​debo estar perdiendo la solución obvia. Cualquier ayuda es bienvenida.

¡Gracias!

Versiones de la biblioteca:

Primavera 3.1.0 (núcleo, frijoles, buey y similares)Spring WS 2.1.0 (Core y Spring XML)StAX2 2.1WoodSToX 3.2.9 (wstx)JAXB 2.2.5-2 (API + impl)Axiom de Apache 1.2.13 (API + impl + c14n + dom)Apache Mime4j 0.7.2 (núcleo)

El servidor de aplicaciones es Oracle 11g R1 Patchset 1 con Java 1.6.0u14.

Respuestas a la pregunta(0)

Su respuesta a la pregunta