Saltar al contenido

La última biblioteca Open JDK 8 JAXB no puede desarmar objetos con propiedades que contienen caracteres de nueva línea

Ten en cuenta que en las ciencias informáticas un problema casi siempere puede tener varias soluciones, de igual modo nosotros te enseñamos lo más óptimo y eficiente.

Solución:

En mi caso, estoy usando JAXB para convertir algunos objetos en XML y serializarlos en un archivo, a través de StAX/WoodStox. Logré solucionar el problema en cuestión filtrando el XML que se está serializando. En detalle, el enfoque es como:

  1. Definir una costumbre StreamWriter2Delegateanular writeEntityRef()de modo que, cuando este método recibe el código de entidad incorrecto (#xd o #xa), invoca a su delegado para escribir de nuevo el carácter original (es decir, n o r), que en realidad no necesita escaparse:

    @Override
    public void writeEntityRef ( String eref ) throws XMLStreamException
    
        if ( eref == null 
    

Esto es equivalente (aparte de algunos gastos generales) a la solución que ya presentaron para este problema, que debería estar disponible con JDK8u192 (y ya debería estar en JDK 9/10).

  1. envuelve tu XMLStreamWriter2 con el filtro anterior, por ejemplo:

    FileOutputStream fout = new FileOutputStream ( "test.xml" );
    WstxOutputFactory wsof = (WstxOutputFactory) WstxOutputFactory.newInstance();
    XMLStreamWriter2 xmlOut = (XMLStreamWriter2) wsof.createXMLStreamWriter ( fout, CharsetNames.CS_UTF8 );
    xmlOut = new NewLineFixWriterFilter ( xmlOut );
    // Now write into xmlOut, directly or via JAXB
    

El código completo/de producción está aquí. No debería ser difícil adaptar el mismo enfoque a tuberías similares (en general, el problema ocurre porque com.sun.xml.internal.bind.v2.runtime.output.XMLStreamWriterOutput escapa n y r de manera incorrecta, por lo que el truco consiste en secuestrar esta codificación incorrecta de los niveles superiores).

geoff s,

Traté de comentar sobre la publicación existente, pero rápidamente descubrí que necesitas tener “50 reputaciones” que yo no tengo.

Parece que estoy experimentando un problema similar cuando pasamos a JDK 1.8.0_161 y 1.8.0_162, algunos de nuestros servicios SOAP comenzaron a generar las siguientes excepciones

Feb 28, 2018 8:34:12 AM com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl createEntityReference
SEVERE: SAAJ0543: Entity References are not allowed in SOAP documents
SEVERE: java.lang.UnsupportedOperationException: Entity References are not allowed in SOAP documents
javax.xml.ws.WebServiceException: java.lang.UnsupportedOperationException: Entity References are not allowed in SOAP documents
    at com.sun.xml.internal.ws.handler.ClientSOAPHandlerTube.callHandlersOnRequest(ClientSOAPHandlerTube.java:135)
    at com.sun.xml.internal.ws.handler.HandlerTube.processRequest(HandlerTube.java:112)
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:1121)
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:1035)
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:1004)
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:862)
    at com.sun.xml.internal.ws.client.Stub.process(Stub.java:448)
    at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:178)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147)
    at com.sun.proxy.$Proxy38.getUserProfile(Unknown Source)

Como se indica en la pregunta anterior y otros hilos:

  • https://bugs.openjdk.java.net/browse/JDK-8196491
  • https://bugs.java.com/view_bug.do?bug_id=8196491

Tiene algo que ver con las nuevas líneas en la carga útil. Por ejemplo, algunas de nuestras cargas útiles incluyen cadenas XML que tienen nuevas líneas que causan el problema. sin embargo, si se eliminan las nuevas líneas antes de llamar al servicio, entonces funciona. Ver inmediatamente a continuación:

Fallar



XXXX
XXXXXX, XXXXXX
(xxx)xxx-xxxx
<![CDATA[MY TITLE]]>
[email protected]

Obras

XXXXXXXXXX, XXXXXX(xxx)xxx-xxxx<![CDATA[MY TITLE]]>[email protected]

¿Usted o alguien más sabe si existe otra solución que no sea eliminar la carga útil de las “líneas nuevas”? ¿Se considera esto un error en el último JDK de Oracle y hay planes para rectificar el comportamiento?

Gracias

máximo

Reseñas y calificaciones

Recuerda que te permitimos aclarar .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *