2012-05-28 5 views
1

J'ai une classe comme ça:Erreur De retour à Java Web Services

@Override 
public StudentDTO getStudent(@WebParam(name = "name") String studentName) { 
    StudentDTO student = new StudentDTO(); 
    try { 
     student = studentService.findStudentByName(studentName); 
    } catch (Exception e) { 
     return new ErrorActionResponse("student couldn't find by name"); 
    } 
    return student; 
} 

Comme d'habitude cela ne fonctionne pas à cause de type de retour est StudentDTO et j'essaie de retourner un autre type de classe: ErrorActionResponse. ErrorActionResponse est une classe d'erreur qui contient des informations détaillées sur les erreurs.

Comment puis-je concevoir mon architecture de service Web capable de gérer les situations d'erreur? (A mon architecture REST j'écris des informations d'erreur en réponse et envoie erreur côté client)

Répondre

1

Si vous souhaitez renvoyer un Collection (comme indiqué dans un commentaire à ma réponse précédente), je vous suggère de créer une carte avec deux clés. S'il n'y a pas d'exception, la première paire clé-valeur contiendra respectivement la chaîne "students" et la collection StudentDTO. Et la deuxième paire clé-valeur contiendra respectivement une chaîne "exception" et une valeur nulle. S'il existe une exception, la première paire valeur/clé contiendra respectivement la chaîne "students" et la valeur null. Et, la deuxième paire clé-valeur sera respectivement une chaîne "exception" et un objet ErrorActionResponse. Exemple:

Aucun cas d'exception:

Map<String, List> result = new HashMap<String, List>(); 
result.put("students", COLLECTION_OF_STUDENTS); 
result.put("exception", null); 

Aucun cas d'exception:

Map<String, List> result = new HashMap<String, List>(); 
result.put("students", null); 
result.put("exception", ErrorActionResponse_OBJECT); 

Hope this helps ...

1

Pour plus d'impact moins je suggère: Faire ErrorActionResponse en tant que membre privé de StudentDTO avec des méthodes setter et getter. En service, lorsqu'il existe une exception, instanciez ErrorActionResponse et définissez-le dans le membre StudentDTO. Donc, le client doit d'abord vérifier si getErrorActionResponse() renvoie null. Si c'est le cas, faites un traitement normal, gérez le cas d'exception.

CLASSE StudentDTO:

public class StudentDTO { 

    ... 
    private ErrorActionResponse errorActionResponse; 
    ... 

    public ErrorActionResponse getErrorActionResponse() { 
     return errorActionResponse; 
    } 

    public void setErrorActionResponse(ErrorActionResponse errorActionResponse) { 
     this.errorActionResponse = errorActionResponse; 
    } 

} 

SERVICE:

@Override 
public StudentDTO getStudent(@WebParam(name = "name") String studentName) { 
    StudentDTO student = new StudentDTO(); 
    try { 
     student = studentService.findStudentByName(studentName); 
    } 
    catch (Exception e) { 
     student.setErrorActionResponse(new ErrorActionResponse("student couldn't find by name")); 
    } 
    finally { 
     return student; 
    } 
} 

CODE CLIENT:

if(student.getErrorActionResponse() == null) { 
    // do normal processing 
} 
else { 
    // handle exception case 
} 

Dans le cas ci-dessus, DTO a membre ErrorActionResponse qui n'est pas lié à son état fondamental . Donc, pour une approche plus propre, je vous suggère d'envisager Adapter pattern.

+0

Si je tente de retourner la liste des étudiants que je vais devoir mettre errorActionResponse de tous les étudiants à la liste – kamaci

+0

Je suis d'accord. Ma première suggestion était pour votre exigence OP - méthode qui renvoie un étudiant et non une liste (que vous énoncez maintenant). – San