Avatar billede fastpoint Nybegynder
26. oktober 2005 - 16:34 Der er 21 kommentarer og
1 løsning

webservices og SOAP

Jeg skal lave en webservice.
På denne skal jeg håndtere SOAP faults og SOAP exceptions så brugeren får pæne fejlmeddelelser, men hvor er det man gør det henne?

I den fil, som man har lavet ud fra sin webservice eller i den klasse fil som man har lavet sin webservice ud fra?

Jeg kan ikke se hvor de skal fanges henne.
Avatar billede arne_v Ekspert
26. oktober 2005 - 16:39 #1
dit valg

du kan vælge at lave dit web service API så du aldrig smider en exception og
bare returner nogle værdier, så catcher du exception på server side og
returnerer de værdier som client så kan teste på

du kan vælge at smide exception og så lade client have en try catch mekanisme
og udskrive noget pænt til brugeren

client skal under alle omstændigheder håndtere fejl som ligger mellem din kode
server side og client kode (altså fejl i servlet container, netværks fejl etc.)
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 16:42 #2
Jeg har et database kald i en try catch blok, men når der sker fejl i denne så kommer der en SOAP exception.

Den udføre ikke det i catch blokken.

Tror jeg.
Avatar billede arne_v Ekspert
26. oktober 2005 - 16:48 #3
det bør den !

en RunTime exception som du ikke catcher ?

eller er der noget som ikke er blevet sat og som bruges senere og der giver en NullPointerException ?
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 16:54 #4
fremprovokere med vilje denne fejl

SOAPException: faultCode=SOAP-ENV:IOException; msg=Connection refused: connect; targetException=java.net.ConnectException: Connection refused: connect]
at org.apache.soap.SOAPException.<init>(SOAPException.java:78)
    at oracle.soap.transport.http.OracleSOAPHTTPConnection.send(OracleSOAPHTTPConnection.java:765)
    at org.apache.soap.rpc.Call.invoke(Call.java:261)
    at mypackage.SportKStub.tilmeld(SportKStub.java:97)
    at _Sporten._jspService(Sporten.jsp:11)
    [/Sporten.jsp]
    at oracle.jsp.runtime.HttpJsp.service(HttpJsp.java:139)
    at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:349)
    at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:509)
    at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:413)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)
    at oracle.security.jazn.oc4j.JAZNFilter.doFilter(Unknown Source)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:604)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:317)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:790)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:270)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:192)
    at java.lang.Thread.run(Thread.java:534)


vil nemlig gerne håndtere alle fejl på en brugervenlig facon.

Sporten.jsp
-
  Boolean status = connection.tilmeld(request.getParameter("fornavn"),request.getParameter("efternavn"),request.getParameter("cprnummer"),request.getParameter("telefon"),request.getParameter("kon"),request.getParameterValues("sportsgrene"));
 

hvor der ikke er try catch blok omkring det kald, men det skal der måske være selv om det er en JSP side?

i SportKStub er der try catch rundt om kaldet til databasen
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 17:04 #5
Det var det.
Men det er ikke pænt?
Avatar billede arne_v Ekspert
26. oktober 2005 - 17:11 #6
det er ikke bruger venligt

du kan godt putte try catch omkring i en JSP side

men try catch burde fangde den server side

hvordan ser koden ud der ?
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 17:17 #7
Her er metoden.

public boolean tilmeld(String fnavn, String enavn, String cprn, String tlf, String k, String[] sportsg)
  {
    String fornavn = fnavn;
    String efternavn = enavn;
    String cprnummer = cprn;
    String telefon = tlf;
    String kon = k;
    String[] sportsgrene = sportsg;

    if(fornavn.equalsIgnoreCase("") || efternavn.equalsIgnoreCase("") || telefon.equalsIgnoreCase("") || cprnummer.equalsIgnoreCase(""))
    return false;
 
    DbConnection connection = new DbConnection();
    ResultSet result;
    String query = "";
    int medlemid = 0;
   
    // Indsæt nyt medlem i database
    query = "INSERT INTO Medlem VALUES (medlemidnr.NEXTVAL,'"+ fornavn +"','"+ efternavn +"','"+ cprnummer +"','"+ kon + "','"+ telefon +"')";
    try{
    connection.executeUpdate(query);
    // indsættelse af nyt medlem færdig!
   
    // hent nye medlems medlems ID. Det skal bruges når vi tilmelder ham sine sportsgrene
    query = "SELECT Medlemid FROM Medlem WHERE Cprnr = '"+ cprnummer +"'";
    result = connection.executeQuery(query);
   
    if(result.next())
    {
    medlemid = result.getInt("Medlemid");
    }
    // hentning af dette medlemsID færdig
   
   
    // Indsættelse af sportsgrene og knytte dem til det nye medlem
    if(!sportsgrene[0].equalsIgnoreCase(""))
    {
      for (int i = 0; i < sportsgrene.length; i++)
      {
        query = "INSERT INTO Knytter VALUES ("+ Integer.parseInt(sportsgrene[i].toString()) +","+ medlemid +")";
        connection.executeUpdate(query);
      }
    }
    return true;
    }
    catch(SQLException xx)
    {
      return false;
    }

  }

Det er en underlig webserice ja, men viste ikke hvad man ellers kunne lave.
Avatar billede arne_v Ekspert
26. oktober 2005 - 17:23 #8
gæt:

DbConnection connection = new DbConnection();

fejler så connection er null

connection.executeUpdate(query);

fejler derfor med en NullPointerException og ikke med en SQLException
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 17:25 #9
kan man catche flere exceptions i samme metode?
for er godt klar over det
Avatar billede arne_v Ekspert
26. oktober 2005 - 17:26 #10
ja da

try {
  ...
} catch (Exception1 ex) {
  ...
} catch (Exception2 ex) {
  ...
} catch (Exception3 ex) {
  ...
}
Avatar billede arne_v Ekspert
26. oktober 2005 - 17:30 #11
men jeg tror at jeg ville vælge at teste for det null fremfor at catche
NullPointerException
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 17:31 #12
har prøvet dette

    catch(SQLException xx)
    {
      return false;
    }
    catch(NullPointerException asd)
    {
      return false;
    }
    catch(SOAPException dgfe)
    {
      return false;
    }

men den siger Error(71,5): exception org.apache.soap.SOAPException is never thrown in the corresponding try block
Avatar billede arne_v Ekspert
26. oktober 2005 - 17:36 #13
den sidste skal ikke med

det er en som laves længere ude en din kode
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 17:39 #14
I opgave beskrivelsen står der man skal håndtere SOAP exceptions og faults

første linje SOAPException: faultCode=SOAP-ENV:IOException; msg=Connection refused: connect;

hvor skal jeg fange den henne? i stub filen?
Avatar billede arne_v Ekspert
26. oktober 2005 - 21:04 #15
SOAP exceptions kastes af SOAP toolkittet og kan derfor ikke catches
i din web srevice kode.

Den kan kun catches i client kode.
Avatar billede arne_v Ekspert
26. oktober 2005 - 21:05 #16
jævnfør sidste del af 16:39:43
Avatar billede fastpoint Nybegynder
26. oktober 2005 - 23:35 #17
du sagde tidligere at det ikke var brugervenligt med en try catch block i JSP delen, men det er altså nødvendigt hvis jeg vil fange den?
Avatar billede arne_v Ekspert
27. oktober 2005 - 00:31 #18
det var display af fejl stacktracen som jeg ikke syne svar pænt

ja du skal fange den

og kan du ikke putte det i en bean klasse fremfor i JSP koden ?
Avatar billede fastpoint Nybegynder
27. oktober 2005 - 08:13 #19
På clientsiden bestemmer jeg selv hvad der skal laves, men tror opgaven går ud på der fra server siden bliver lavet er robust webservice.

så det er vel der den skal sørge for SOAP exceptions bliver håndteret korrekt?
Avatar billede arne_v Ekspert
27. oktober 2005 - 11:53 #20
flowet er:

din client kode--(kald)--genererer stub kode--(netværk)--Tomcat kode--(kald)--generel web service servlet kode--(kald)--din server kode

din server kode kan ikke fange exceptions i kode til venstre for den og
derfor skal der vær enoget fejl håndterings kode i din client kode uanset hvor
pæn din server kode er
Avatar billede arne_v Ekspert
31. december 2005 - 15:30 #21
All set ?
Avatar billede fastpoint Nybegynder
05. februar 2006 - 14:46 #22
kunne ikke være bedre:) tak for hjælpen! og undskyld ventetiden
jeg gør det altid
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester