9
votes

Comment réparer l'espace de tas Java sur WebSphere lors de l'envoi de XML invalide

Quand j'envoie XML invalide à mes services Web sur WebSphere Server, je reçois un tas de tas Java: xxx pré>

avec l'élément p> xxx pré>

Tout fonctionne bien p>

Exception: p>

Caused by: org.xml.sax.SAXParseException: The element type "urn:ZadostInfo" must be terminated by the matching end-tag "</urn:ZadostInfo>".
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) ~[?:?]
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) ~[?:?]
        at org.xml.sax.helpers.XMLFilterImpl.parse(Unknown Source) ~[?:?]
        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Unknown Source) ~[?:?]
        at com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer.transform(EfficientStreamingTransformer.java:411) ~[?:1.7.0]
        at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:115) ~[?:1.7.0]
        at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl.createEnvelopeFromSource(SOAPPart1_1Impl.java:80) ~[?:1.7.0]
        at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:140) ~[?:1.7.0]
        at org.springframework.ws.soap.saaj.support.SaajUtils.getSaajVersion(SaajUtils.java:155) ~[spring-ws-core-2.1.2.RELEASE.jar:?]


12 commentaires

Avez-vous résolu cela? J'ai le même problème.


Nope attend toujours de répondre


Avez-vous déjà essayé d'étendre le SACE du tas pour les paramètres JVM?


pas encore parce que je ne vois aucune raison quand cela fonctionne lorsque j'envoie un message XML valide


@Zeusnet essayé mais sans succès


Quelle taille est votre taille de tas maximum dans votre configuration WebSphere? L'erreur de démarrage indique normalement qu'il existe à de nombreux objets intitus à ce moment-là. Donc, je me suis dit si vous augmenteriez la taille du tas, il devrait résoudre le problème


J'augmente la taille maximale du tas à 4 Go, comme vous pouvez le voir dans "PS2:" Mais maintenant, il y a une autre exception. Je pense qu'il y a un bug dans ibm java parce que quand j'utilise le soleil, alors ça marche ok avec 2 Go


Cela semble très interessessant, je pourrais être possible que son bogue dans la mise en œuvre IBM. Mais je ne suis pas très familier avec ces implémentées


Cela ressemble à un insecte WebSphere pour moi, je vais donc élever un incident de soutien avec IBM


hm et comment? Je ne suis pas partenaire d'IBM. Comment devrais-je signaler ce bogue


WebSphere est un produit sous licence. Il vient avec le soutien. Cependant, parfois, vous pouvez obtenir de l'aide au WebSphere Application Server Forums


J'ajoute déjà ce sujet à leur forum: ibm.com/developerworks/community/forums/html/... mais toujours sans succès


7 Réponses :


2
votes

Le meilleur moyen est d'utiliser Spring PayPloadTinterItterceptor pour valider le XML entrant contre le schéma XML avant de pouvoir être analysé davantage ... Code exemple: xxx

Pour plus de détails, lisez le ressort documentation


8 commentaires

Je suis validation XML mais ce site WebSphere sont avant cette validation


pouvez-vous décrire comment vous validez?


Qu'est-ce que vous voulez décrire? J'ai la validation semblable que vous avez posté


Si vous avez défini votre intercepteur de validation, cela devrait être appelé avant que la bibliothèque basée sur WebSphere soit invoquée pour l'analyse réellement du message .... Donc, dans le cas d'une valeur XML invalide, le traitement doit s'y arrêter avec une faute de savon au consommateur ..... Une chose, définissez l'intercepteur personnalisé défini par l'utilisateur et voyez si l'intercepteur est vraiment invoqué ...


Désolé mais vous avez tort de voir ma réponse mise à jour. Les intercepteurs sont appelés après WebSphere Stuff à propos de Saaj


Cela ne me convient pas, il n'y a pas de point de validation post message d'analyse ...... Pourriez-vous préciser la définition de haricot de WebserviceTemplate que vous utilisez .....


Pourquoi ? Votre validation ci-dessus valide juste XML contre XSD. Mais la validation de XML bien formé doit être avant cela.


La vérification du puits de puits XML est effectuée séparément et indépendamment uniquement s'il existe plusieurs nœuds de traitement XML, votre système ... alors il est logique de vérifier la formidation de la puces XML ... sinon la validation de schéma XML et la formation bien en forme sont combinées. .Veuillez publier la définition de haricot de WebServiceTemplate ... Je devrais pouvoir résoudre votre problème ....



2
votes

Vous venez de trouver un bug. S'il vous plaît signaler le bogue. Depuis cela est liée à l'analyse. Vous pouvez faire deux choses.

Tout d'abord, vous pouvez prendre une mémoire de mémoire. Il suffit de jeter la mémoire (ou de profiler cela à l'aide de VisualvM et créez un profil de mémoire). De cette façon, vous comprenez ce qui polute la mémoire.

seconde, vous pouvez corriger le problème que vous avez trouvé. Je fais tout le chemin avec le code tiers. Donc, juste avant de passer à l'analyse de l'extrait que vous effectuez une autre étape d'évaluation si le XML est correct sans vérifier le shema. Il suffit d'utiliser un analyseur avec aucun shema impliqué.

Afin de fournir une implémentation modifiée, utilisez le code SOURCECODE ou s'il n'est pas disponible, décompilez-le ou renommez la classe et fournissez une nouvelle classe de mise en œuvre qui s'étendit de ceci. S'il s'agit d'une méthode privée ou d'une fonctionnalité, vous devez accéder simplement à modifier le code octet.

Pour injecter votre version, ajoutez simplement votre classe à votre parcours de classe (ou à la classe de classe du WebSphere) et mettez-la devant. Habituellement, votre code est précédé pour tout code de bibliothèque. De cette façon, vous pouvez remplacer chaque détail de mise en œuvre de n'importe quelle bibliothèque tant que vous contrôlez la classe de classe (généralement en la définissant dans le Java.exe.

Ajoutez simplement un test supplémentaire pour l'exactitude avant la sortie de cette version bugée. Et signaler le bogue et aussi le blog à ce sujet.

Si vous avez des questions ou si vous avez besoin d'un outil, demandez simplement. Je fais cela régulièrement. Avec logiciel open source et non open-open. Aussi génial pour d'autres choses comme l'extension des fonctionnalités.


2 commentaires

HM et comment vous extension du logiciel non open source? J'ai essayé de vérifier le XML bien formé avec Spring-WS avant que WebSphere ne le soit donc j'espère que ça va. Mon exemple travaille également sur un autre serveur (j'ai essayé Tomcat) mais ce n'est pas nécessaire


Le logiciel non open source est simplement un logiciel. Bytecode peut être décompilé et si vous n'avez pas fait cela, essayez-le avec votre propre code. C'est incroyable à quel point cela semble. Tout comme les sources. S'ils obfluent seulement renommer la classe (manipulation du code d'octet) et fournir votre propre code s'étendant de cela renommé qu'un. C'est si simple. Essayez-le vous-même c'est un excellent atout dans votre boîte à outils.



2
votes

J'ai essayé de résoudre ce problème par moi-même. J'ai examiné comment Spring-WS validez XML et a essayé de le faire avant WebSphere. Voici le code. Je le teste et ça marche pour moi. xxx pré>

et au contexte de printemps i Ajouter: P>

<bean id="messageFactory" class="cz.isvs.ais3.ws.validator.SaajSoapMessageValidatorFactory" />


0 commentaires

2
votes

Après Martin Advise, j'essaie de décompiler le code IBM et je pense que le problème est dans cette procédure: XXX PRE>

Section du problème: P>

                if(originalContent == null)// I am not sure but I think this will never happend. So to fix it I will delete this condition and  throw this 
exception not the second one where it want to display message
                        throw WebServicesFault.makeFault("To see the message containing the parsing error in the log, either enable web service engine tracing or set MessageContext.setHighFidelity(true).", ((Throwable) (real == null ? ((Throwable) (e)) : ((Throwable) (real)))));
                    else
                        throw WebServicesFault.makeFault("Message being parsed: " + originalContent.getString(), ((Throwable) (real == null ? ((Throwable) (e)) : ((Throwable) (real)))));
                }
                if(log.isDebugEnabled())
                    log.debug("Done parsing inputSource.");
                originalParseLength = wsis.getContentLength();
                soapEnvelope = dser.getEnvelope();
                setCurrentForm(soapEnvelope, 4);
                String messageProtocol = getMessage().getSOAPConstants().getSOAPProtocol();
                String factoryProtocol = soapEnvelope.getSOAPFactory().getSOAPConstants().getSOAPProtocol();
                String envelopeProtocol = "SOAP 1.1 Protocol";
                String ns = soapEnvelope.getNamespaceURI();
                if(soapEnvelope.getNamespaceURI().equals("http://schemas.xmlsoap.org/soap/envelope/"))
                    envelopeProtocol = "SOAP 1.2 Protocol";
                if(messageProtocol.equals("Dynamic Protocol"))
                {
                    getMessage().setSOAPConstants(soapEnvelope.getSOAPFactory().getSOAPConstants());
                    messageProtocol = getMessage().getSOAPConstants().getSOAPProtocol();
                }
                if(envelopeProtocol.equals(factoryProtocol) && factoryProtocol.equals(messageProtocol))
                {
                    if(log.isDebugEnabled())
                        log.debug("The protocol is: " + envelopeProtocol);
                } else
                if(log.isDebugEnabled())
                {
                    log.debug("The SOAPEnvelope protocol is: " + envelopeProtocol);
                    log.debug("The SOAPFactory protocol is: " + factoryProtocol);
                    log.debug("The SOAPMessage protocol is: " + messageProtocol);
                }
            }
        return soapEnvelope;
    }


0 commentaires

3
votes

Ceci ressemble à un bogue WebSphere. Utiliser Spring-WS, j'ai eu l'erreur:

Java.lang.outofMemoryError: Espace tasse Java chez com.ibm.ws.wewservices.Utils.bais.create (Bais.Java:74)

J'ai réussi à résoudre de cette façon: mettre dans / appServer / lib / ext Cette bibliothèque: Axis2-Saaj-1.6.2.jar (a travaillé pour moi sur WebSphere V8.5 et Spring-WS V2.2.0, mais vous pouvez avoir à changer la version).

explication

Lorsque Spring-WS demande une implémentation de javax.xml.soap.MessageFactory, elle obtient une instance com.ibm.ws.ws.wservices.engine.ws.websservices.Angine.soap.MessageFactoryImpl Instance (de WebSphere Runtime) au lieu d'un com.sun.xml.internal .Messaging.Saaj.Soap.MessageAfactoryImplent une instance (de JVM), qui conduit à l'erreur mentionnée. La bibliothèque AXIS2-SAAJ contient également une implémentation Javax.xML.SOAP.MessageFactory: org.apache.axis2.saaj.MessageFactoryImpl. Celui-ci est maintenant utilisé lorsque Axis2-Saaj est dans le dossier LIB / EXT et que l'erreur est partie (j'ai également configuré le dernier point de classe, ne sais pas si cela compte ici)

mise à jour

@hudi Votre solution est correcte, je viens de le tester. Malheureusement, je ne peux pas vous uppoter.


0 commentaires

1
votes

Client à l'aide de WebSphere 8.5.5.x avec SDK 1.7 et à l'aide de SAAJ avec Spring FRMAE Work peut rencontrer OutofMemoryError lors de l'envoi de la demande de savon qui a une demande invalide. Ceci est dû à Bug Correction est allé dans les versions SDK 1.7 et ultérieures.

IBM a corrigé ce problème via IBM SDK APAR IV73614. P>

Les détails de la correction de bugs sont entrés dans les versions ultérieures P>

JAVA.IO.PACKEDINPUTSTREAM.AVAILABLE() RETURNS INTEGER.MAX_VALUE I.E., 2147483647 ON EMPTY STREAM IN JAVA 7

From javacore stack indicate following 4XESTACKTRACE at com/ibm/ws/webservices/utils/BAIS.create(BAIS.java:74) 4XESTACKTRACE at com/ibm/ws/webservices/utils/WebServicesInputSource.getBAISContent(WebServicesInputSource.java:744) 4XESTACKTRACE at com/ibm/ws/webservices/utils/WebServicesInputSource.getByteArrayContent(WebServicesInputSource.java:710) 4XESTACKTRACE at com/ibm/ws/webservices/utils/WebServicesInputSource.getStringContent(WebServicesInputSource.java:674) 4XESTACKTRACE at com/ibm/ws/webservices/utils/WebServicesInputSource.getString(WebServicesInputSource.java:425(Compiled Code)) 4XESTACKTRACE at com/ibm/ws/webservices/engine/SOAPPart._getSOAPEnvelope(SOAPPart.java:1090(Compiled Code)) 4XESTACKTRACE at com/ibm/ws/webservices/engine/SOAPPart.getAsSOAPEnvelope(SOAPPart.java:628(Compiled Code)) 4XESTACKTRACE at com/ibm/ws/webservices/engine/SOAPPart.getEnvelope(SOAPPart.java:656(Compiled Code)) 4XESTACKTRACE at org/springframework/ws/soap/saaj/support/SaajUtils.getSaajVersion(SaajUtils.java:155) 4XESTACKTRACE at org/springframework/ws/soap/saaj/SaajSoapMessage.getSaajVersion(SaajSoapMessage.java:257) 4XESTACKTRACE at org/springframework/ws/soap/saaj/SaajSoapMessage.getImplementation(SaajSoapMessage.java:342(Compiled Code))


0 commentaires