2016-04-09 10 views
0

Ich authentifiziere Benutzer mit Name und Passwort aus meiner Datenbank. Wenn der Benutzername oder das Passwort falsch ist, erstelle ich eine benutzerdefinierte Ausnahme.Jersey Antwort für Ausnahme funktioniert nicht wie erwartet

aber ich erwarte nicht Statuscode und Antwort.

Ich bin neu in Jersey und Web-Dienste.

Dies ist meine Funktion, die eine Antwort erstellt:

public static Response error(int Status_code, String Request_status ,String data, String Response_error){ 
     ResponseBuilder response = new ResponseBuilder(); 
     response.Status_code = Status_code; 
     response.Request_status = Request_status; 
     response.data =data; 
     response.Response_error = Response_error; 

     return Response.status(Status_code).entity(response).build(); 
    } 

Dies ist meine benutzerdefinierte Exception-Klasse Code:

public class InvalidcredentialsException extends WebApplicationException { 
    public InvalidcredentialsException(Response response) { 
     super(response); 

    } 
} 

Dies ist, wie ich werfen diese Ausnahme in meinem Code, wenn Anmeldeinformationen falsch sind (Benutzername und Kennwort) in der Funktion "AuthenticateUser" in meinem Modell.

throw new InvalidcredentialsException(ResponseBuilder.error(Response.Status.UNAUTHORIZED.getStatusCode(),"success","","invalid credentials")); 

Wenn ich meine API bin Überprüfung ich 204 als Antwort immer bin, aber ich bin eine JSON mit den Parametern erwarten, die ich zur Verfügung gestellt haben.

Ich habe meine API auf folgende Weise umgesetzt:

@Path("/user") 
public class User { 

    @POST 
    @Path("/login") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces("application/json") 
    public void UserAuthentication(UserCredentials user) { 


     UserModel userAuthentication = new UserModel(); 
     userAuthentication.AuthenticateUser(user); 


    } 
} 

ich den folgenden Link verwendet Ausnahme zu erstellen und werfen:

JAX-RS/Jersey how to customize error handling?

Dies ist meine beglaubigen Funktion:

public void AuthenticateUser(UserCredentials user) { 
     Database db = new Database(); 
     Connection con = null; 
     PreparedStatement preparedStatement = null; 
     ResultSet rs = null; 
     try { 
      String username = user.getUsername(); 
      String password = user.getPassword(); 


      con = db.getConnection(); 

      if (con != null) { 

       String selectQuery_UserDetails = "SELECT name,password FROM user WHERE name=? AND password = ?"; 

       preparedStatement = con.prepareStatement(selectQuery_UserDetails); 
       preparedStatement.setString(1, username); 
       preparedStatement.setString(2, password); 
       rs = preparedStatement.executeQuery(); 

       if (!rs.isBeforeFirst()) { 
        throw new InvalidcredentialsException(ResponseBuilder.error(Response.Status.UNAUTHORIZED.getStatusCode(),"success","","invalid credentials")); 

       } 

      }}catch (SQLException e) { 

     } finally { 
      db.closeConnection(con); 

     } 

     } 

Danke

+0

Ich nehme an, dass 'userAuthentication.AuthenticateUser (user);' keine Ausnahme auslöst. Wie implementieren Sie es? –

+0

@Meiko: Ich habe meine Frage bearbeitet und auch meine AuthenticateUser-Funktion veröffentlicht. Danke für Ihre Antwort. –

Antwort

1

Sie fangen, aber nicht die SQLException Handhabung. Wenn beim Zugriff auf die Datenbank oder beim Versuch, auf sie zuzugreifen, ein Fehler auftritt, wird die Ausnahme ignoriert und keine Fehlerreaktion erstellt. Vielleicht ist die Datenbank nicht zugänglich oder falsch konfiguriert. Sie sollten die Ausnahme in eine RuntimeException wie javax.ws.rs.InternalServerErrorException umbrechen oder einfach die catch-Anweisung entfernen. Und Sie sollten den Fehler hier oder in einem exception mapper protokollieren, damit Sie das Problem analysieren und beheben können.

Ich schlage vor, die Ausnahme und melden Sie es so wickeln:

}catch(SQLException e){ 
    logger.log(Level.SEVERE, "db error while authenticate user", e); 
    throw new InternalServerErrorException("db error while authenticate user", e); 
} 

Nun ist die Laufzeitausnahme wird von einem Standard exception mapper behandelt werden, die die Fehlerreaktion erzeugen. Zusätzlich wird der Fehler protokolliert. In diesem Code habe ich java.util.logging verwendet - passen Sie es gegebenenfalls an die Logging-API an, die Sie verwenden.

+0

Die Ausnahme ungültige Anmeldeinformationen wird geworfen, ich habe es debuggt. Es ruft auch den Superkonstruktor auf. Jetzt verstehe ich nicht, wenn mein InvalidCredentials Super Konstruktor aufruft, warum bekomme ich keine Client-Antwort. Ist es notwendig, InvalidCredentials zu erfassen, da in der oben erwähnten Verknüpfung geschrieben steht: "Beachten Sie, dass Sie die Ausnahme nicht in einer throws-Klausel deklarieren müssen, weil WebApplicationException eine Laufzeitausnahme ist.Dies wird eine 401-Antwort an den Client zurückgeben. ". –

+0

Ich habe auch herausgefunden, dass, wenn ich eine catch-Anweisung für InvalidCredentials in meiner Authentifizierungsfunktion hinzufügen, dann nach dem Aufruf der Super-Methode kommt es zum Catch-Teil, dies bedeutet, dass die Ausnahme funktioniert –

+0

Was ich erreichen möchte, ist: 1. Wenn die Anmeldeinformationen nicht mit dem Datenbankeintrag übereinstimmen, dann muss es meine benutzerdefinierte Ausnahme werfen. 2. Nach dem Auslösen einer Ausnahme sollte eine Antwort in dem Format erstellt werden, das ich möchte ((für die ich ResponseBuilder verwende). 3. Die Antwort, die erstellt wird, sollte UserAuthentication-Funktion in meiner API, die JSON erzeugt, gegeben werden. 4. Und schließlich dieses JSON als Antwort. –