Pourquoi reçois-je des java.lang.NullPointerException plutôt que de la réponse soap?
Je suis l'envoi de la requête vers le serveur, quand je copie de la demande et de l'utilisation de la SOAPUI il montre la bonne réponse,
mais lorsque j'utilise le code suivant pour générer et envoyer, renvoie
java.lang.NullPointerException
sur la ligne 50, qui est
sm.writeTo(out);
code:
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection connection = soapConnectionFactory.createConnection();
SOAPFactory soapFactory = SOAPFactory.newInstance();
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage message = factory.createMessage();
SOAPHeader header = message.getSOAPHeader();
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPBody body = soapEnvelope.getBody();
header.removeNamespaceDeclaration(header.getPrefix());
soapEnvelope.addNamespaceDeclaration("v9", "ADDRESS OF SERVICE");
Name bodyName;
bodyName = soapFactory.createName("User");
SOAPElement getList = body.addChildElement("User", "v9");
Name childName;
getList.addChildElement("name", "v9").addTextNode("Alex");
getList.addChildElement("surname", "v9").addTextNode("Nicroid");
message.writeTo(System.out);
URL endpoint = new URL("ENDPOINT ADDRESS OF SERVER");
SOAPMessage response = connection.call(message, endpoint);
connection.close();
SOAPMessage sm = response;
ByteArrayOutputStream out = new ByteArrayOutputStream();
sm.writeTo(out); //java.lang.NullPointerException
System.out.println(out.toString());
Maven
<url>http://maven.apache.org</url>
<build>
<resources>
<resource>
<targetPath>META-INF</targetPath>
<directory>src</directory>
<includes>
<include>jax-ws-catalog.xml</include>
<include>wsdl/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2.1</version>
<dependencies>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<configuration>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>true</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>webservices-rt</artifactId>
<version>1.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Pourriez-vous nous fournir l'ensemble de la stacktrace? Parce que c'est assez similaire à l'exemple de la SAAJ à partir de Oracle du site, et il a besoin d'fournisseur réel (
La méthode de connexion.appel le plus probablement renvoie la valeur null au lieu de la réponse. Veuillez pusblish votre stacktrace.
J'ai utilisé le même code pour un autre webservice et travaillé. Pas sûr pourquoi elle se montre cette erreur. Il montre juste "de java.lang.NullPointerException"
Essayez
Sur la ligne 50, il y a deux objets qui peuvent être null:
saaj-impl.jar
ou alternatives, telles que AXE)La méthode de connexion.appel le plus probablement renvoie la valeur null au lieu de la réponse. Veuillez pusblish votre stacktrace.
J'ai utilisé le même code pour un autre webservice et travaillé. Pas sûr pourquoi elle se montre cette erreur. Il montre juste "de java.lang.NullPointerException"
Essayez
sm.writeTo(System.out)
si cela fonctionne. Peut-être que votre OutputStream objet out
est null.Sur la ligne 50, il y a deux objets qui peuvent être null:
sm
et out
. Depuis sm.writeTo(System.out);
obtient la même erreur, sm
est null. sm
est égal à response
, ce qui équivaut à connection.call(message, endpoint);
. .call()
renvoie "la SOAPMessage objet qui est la réponse à un message qui a été envoyé". Par conséquent, vous ne recevez pas de réponse de votre serveur.
OriginalL'auteur | 2013-11-13
Vous devez vous connecter pour publier un commentaire.
Si vous rencontrez des NullPointerException à la ligne 50, c'est parce que st est null. C'est connexion.appel(message, point de terminaison); retourne null.
En supposant que vous utilisez la valeur par défaut de mise en œuvre de SOAPConnection (com.soleil.xml.interne.de messagerie.saaj.client.le p2p.HttpSOAPConnectionFactory -
Voir http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/xml/soap/SOAPConnectionFactory.java - Lignes 47-48)
Il y a juste quelques raisons de méthode appel(...) peut retourner la valeur null:
Voir http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnection.java#HttpSOAPConnection.call%28javax.xml.soap.SOAPMessage%2Cjava.lang.Object%29 Lignes de 281 à 341.
Je ne peux pas aller plus loin dans l'analyse, car je ne suis pas en mesure de reproduire le problème. Je vous suggère de télécharger le code source des classes java, un lien vers votre débogueur et de l'exécuter en mode debug pour voir ce qui se passe en fait dans votre cas d'utilisation.
Je pensais à quelque chose comme ceci: stackoverflow.com/a/1961628/3008950 appliquée à la saaj application que vous utilisez (au lieu de junit.jar comme mentionné dans ce post)... Généralement il peut aider, mais honnêtement, je crains que cette fois, il n'est pas si simple que je le pensais (j'ai essayé avec rt.jar mais je vais avoir des problèmes: le débogueur me montre le code source de la classe, mais il ne semble pas mettre en surbrillance la ligne de code c'est l'exécution)... mais peut-être vous pouvez comprendre comment le faire fonctionner.
OriginalL'auteur Dario
La classe que vous utilisez, SOAPMessage, est abstraite, comme est la méthode writeTo(). Cela signifie qu'il n'existe pas de code autre que la définition de la méthode (similaire à un prototype de fonction en C). L'intérieur (à l'intérieur des accolades de la méthode) sont vides. Pour résoudre votre problème, vous avez besoin d'étendre la SOAPMessage classe dans une nouvelle classe et de fournir une implémentation pour les méthodes qui y sont.
Notions de base de l'abstraction ici: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
mais je suis en utilisant exactement le même code pour un autre service web et il fonctionne
OriginalL'auteur DYezek
SOAPConnection.call() est abstrait est-il pas?
Vous devez sous-classe de la classe, fournir des implémentations concrètes de ses méthodes abstraites et ensuite l'instancier.
Sinon vous allez vous retrouver avec des Npe que vous ne peut pas instancier une classe abstraite.
Est-ce un webservice java vous appelez ou une sorte de code natif? De toute façon, pourquoi ne pas consommer le wsdl et générer un client à partir de cela?
Êtes-vous absolument sûr que votre code n'utilise pas HTTPSoapConnection ou un WebServicesTempate? Le code que vous appelez est abstrait, d'où la mise en œuvre n'existe pas, tout simplement vide de méthodes. grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/...
en fait, je suis en utilisant le même code pour un autre service web qui fonctionne parfaitement.
Exactement le même code ou il y a un type polymorphe là? Quelque chose le long des lignes de SOAPConnection = new HttpSoapConnection, ou peut-être plus de chances SOAPConnection est substituée dans votre propre code ou à partir d'une importation. Donc vérifier le colis et tapez dans vos importations, est-il vraiment javax.xml.le savon.SOAPConnection, ou simplement un SOAPConnection objet dans un package différent?
OriginalL'auteur Chaffers
vérifier si sm est nulle en plaçant système..println(" message soap:" +sm)
si la réponse est nulle
vérifiez le contenu de ce message.writeTo(Système d'.); instruction d'impression.
Il sera également donner de l'indice au sujet de votre requête soap est bien formé ou pas
capturer le faible niveau de la requête http que vous envoyez à l'ordinateur d'extrémité à l'aide d'eclipse TCP/IP moniteur ou par d'autres moyens (activer la journalisation du suivi). probablement, votre requête SOAP peuvent ne pas être bien formé alors, serveur à défaut d'envoyer une réponse à dos.
Si vous avez accès au webservice de serveur à serveur ce qui se passe à la demande u envoyés. Vérifier si c'est le traitement de la demande et l'envoi de réponse valide.
J'ai vérifié à l'aide de SoapUI, j'ai imprimer la demande sur console, et de le copier dans SoapUI qui reçoit une réponse correcte, donc une bonne demande sera envoyée, j'ai contacté le searver de l'équipe,ils m'ont dit que cela peut être dû à des paramètres de proxy, mais je n'ai pas configurer les paramètres de proxy
pouvez-vous énumérer la SAAJ Pots que vous utilisez.. laissez-moi savoir si vous avez SAAJ-Impl jar dans le classpath.
J'ai ajouté le contenu de mon pom.xml à la question
OriginalL'auteur rajivas