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:
-
Definir una costumbre
StreamWriter2Delegate
anularwriteEntityRef()
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
or
), 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).
-
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
[email protected]
Obras
XXXX XXXXXX, XXXXXX (xxx)xxx-xxxx [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 .