# SOAP-Client funktioniert plötzlich nicht mehr



## Maliko (31. Mrz 2022)

Moin,

ich stehe gerade vor einem Rätsel. Und zwar habe ich einen Webservice+Client, der bisher immer einwandfrei funktioniert hat. Die letzte Änderung an der Software fand vor mehreren Monaten statt (November 2021). Bis gestern lief er auch problemlos durch. Doch seit heute morgen plötzlich nicht mehr. Wenn ich den Client starte fängt er an zu arbeiten (ich bekomme 2 Fehlermeldungen das die Zugangsdaten falsch sind, was auch korrekt ist) und anschließend stürzt der Client mit folgender Fehlermeldung ab:



> Exception in thread "main" com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: java.lang.NullPointerException Please see the server log to find more detail regarding exact cause of the failure.
> at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
> at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:116)
> at com.sun.xml.internal.ws.client.sei.StubHandler.readResponse(StubHandler.java:238)
> ...



Schaue ich in das Logfile des Services, finde ich nur die beiden Fehlermeldungen bzgl. der falschen Zugangsdaten. Weitere Fehler werden nicht gemeldet, obwohl der Log so programmiert ist, das jegliche Exception geloggt wird. Auch ist der Server weiterhin problemlos erreichbar. Wenn ich die URL aufrufe bekomme ich die WSDL zurückgegeben und auch wenn ich den Client starte läuft er bis zum selben Punkt ebenfalls problemlos durch.

Die Zeile 68 in der ASEKVClient.java ist auch nur der Aufruf des Webservices. Dieser Funktioniert definitiv, da er ja definitiv 2 Anfragen verarbeitet hat, ansonsten hätte ich die Fehermeldungen vom Server ja nicht bekommen.

Die Funktion zum Aufruf ist auch nichts wirklcih wildes. Die sieht wie folgt aus:


```
public static void sendMail() throws MessagingException  {
        try {
            CustomerHandler customerHandler = new CustomerHandler();
            List<ASEKVCustomer> customer = customerHandler.receiveCustomer();
            AuthenticationCredentials credentials = new AuthenticationCredentials();
            int test = 1;
            for (ASEKVCustomer aSEKVCustomer : customer) {
                try {
                    credentials.setUsername(aSEKVCustomer.getUsername());
                    credentials.setPassword(aSEKVCustomer.getPassword());
                    credentials.setMandantid(aSEKVCustomer.getMandantid());
                    credentials.setSoftwareKey("xxxxxx");
               
                    port.sendMails(credentials, "xxx");
               
                    test++;
                } catch(AuthenticationFailedException_Exception | ASEKVException_Exception | FinderException_Exception ex) {}
            }
        } catch(SQLException | ClassNotFoundException ex) {
            //SMTPHandler mail = new SMTPHandler();
            //mail.sendMail(ex.getMessage() + "\n" + Arrays.toString(ex.getStackTrace()));
        }
    }
```

Und das hier ist die Funktion die aufgerufen wird:


```
/**
     *
     * @param userdata
     * @param authenticationString
     * @throws asekvwebservice.Exceptions.AuthenticationFailedException
     * @throws asekvwebservice.Exceptions.ASEKVException
     * @throws asekvwebservice.Exceptions.FinderException
     */
    @Override
    public void sendMails(AuthenticationCredentials userdata, String authenticationString) throws
            AuthenticationFailedException, ASEKVException, FinderException {
        try {
            if(authenticationString.equals(GlobalProperties.getInternalAuthenticationString())) {
                AuthenticatedUser user = this.authenticateUser(userdata);
             
                if(user != null) {
                    if(!user.getEmailSystem().equals("3")) {
                        SMTPHandler mailer = new SMTPHandler();
                        this.loginToService(user);

                        SearchResult result;

                        if(user.getEmailSystem() != null && (user.getEmailSystem().equals("1") || user.getEmailSystem().equals("2"))) {
                            List<String> sysIds = this.mailHandler.getSysIds(user.getMandantId());
                            List<Integer> states =  this.port.getStates(sysIds);
                            int counter = 0;

                            for (Integer state : states) {
                                if(state == 2 || state == 3) {                             
                                    List<Media> response = new ArrayList<>();
                                    ASKostenvoranschlag kv = kvHandler.getKostenvoranschlag(sysIds.get(counter));
                                    response.add(port.getResponseDocumentByNumber(sysIds.get(counter)));
                                    mailer.sendMail(user, kv, response);
                                    ASMailHistorie historie = this.mailHistoryHandler.createHistorie(user, sysIds.get(counter), state, mailer.createGenehmigungsTemplate(kv));
                                    historie.setIsSend(1);
                                    historie.setIsReaded(1);

                                    this.mailHistoryHandler.saveHistory(historie);
                                }

                                counter++;
                            }
                        }

                        if(!GlobalProperties.isDebug()) {
                            result = this.port.getInboxUnreadMessages();
                        } else {
                            result = this.port.getInboxMessages();
                        }

                        int mailCounter = 1;

                        for (String id : result.getData()) {                 
                            Mail receivedMail = this.port.getMessageByKey(id);
                            ASMailHistorie mailHistory = mailHistoryHandler.createHistorie(receivedMail, user);
                            if(user.getEmailSystem().equals("4")) {
                                if(mailer.sendMail(user, receivedMail)) {
                                    mailHistory.setIsSend(1);
                                    this.port.touchMessageByKey(id);
                                    mailHistory.setIsReaded(1);
                                } else {
                                    ErrorLogger.log("Die Nachricht mit der ID {0} konnte nicht versendet werden.");
                                }
                            } else {
                                this.port.touchMessageByKey(id);
                                mailHistory.setIsSend(0);
                                mailHistory.setIsReaded(1);
                            }

                            mailHistoryHandler.saveHistory(mailHistory);

                            mailCounter++;

                            if(GlobalProperties.isDebug() && mailCounter >= 5) {
                                break;
                            }
                        }

                        this.port.logout();
                    }
                } else {
                    throw new AuthenticationFailedException("Authentifizierung fehlgeschlagen. Bitte versuchen Sie es erneut");
                }
            } else {
                throw new AuthenticationFailedException("Funktion sendMails: Der Authentifizierungsschlüssel war ungültig. Bitte überprüfen Sie Ihre Eingabe");
            }
        } catch (ASEKVException ex) {
            throw new ASEKVException(ex.getMessage(), ex);
        }catch (AuthenticationFailedFault_Exception ex) {
            throw new AuthenticationFailedException("Authentifizierung fehlgeschlagen. Bitte versuchen Sie es erneut", ex);
        } catch (Fault_Exception ex) {
            throw new ASEKVException("Allgemeiner Fehler festgestellt. Bitte versuchen Sie es später noch einmal", ex);
        } catch (FinderFault_Exception ex) {
            throw new FinderException("Die von Ihnen angeforderten Daten konnten nicht ermittelt werden. Bitte überprüfen Sie Ihre Parameter.", ex);
        } catch (IOException ex) {
            throw new ASEKVException("Allgemeiner Fehler festgestellt. Bitte versuchen Sie es später noch einmal", ex);         
        }
    }
```

EDIT: Ich bin inzwischen weiter. Nachdem ich einfach ans Ende des Catches noch nen allgemeingültigen Catch-Case gesetzt habe habe ich jetzt auch ne Entsprechende Exception im Log. So wie es aussieht, ist plötzlich ein Objekt leer, welches bisher immer gefüllt war.


----------



## Robert Zenz (31. Mrz 2022)

Ich kann hier nur von CXF reden und ich baue die Services auch teilweise haendisch, aber was moeglich sein sollte ist dass du einen Interceptor (`AbstractSoapInterceptor`) am server registriert als `OutFaultInterceptor`. Dann wird dieser Interceptor immer aufgerufen wenn der Server mit einem Fehler antworten will, und man hat die Moeglichkeit entweder den Fehler nochmal zu bearbeiten (wenn man zum Beispiel eben genau nicht dem Client Details erzaehlen will), aber zumindest kann man dann jeden Fehler separat loggen. Hat den Vorteil dass man dann nicht auf das CXF Logging angewiesen ist wenn ein Fehler auftritt, sondern man hat immer sein eigenes Log.


----------



## Maliko (31. Mrz 2022)

Das ist eine sehr gute Idee. Werde ich bei Zeiten defintiv mal umsetzen. Inzwischen weiß ich genau was los ist. Die Gegenstelle, die der Server antriggert hat Serverprobleme und schickt daher die Daten nicht, die mir jetzt fehlen.


----------

