IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Aspect selon valeur retourn�e


Sujet :

Java

  1. #1
    Membre �m�rite
    Avatar de Da�manu
    Homme Profil pro
    D�veloppeur touche � tout
    Inscrit en
    Janvier 2011
    Messages
    737
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur touche � tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 737
    Par d�faut Aspect selon valeur retourn�e
    Bonjour.

    J'ai une application qui fait appel � une API externe PersonAPI de cette fa�on :
    Code java : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void modifierPersonne() {
        //Traider input
        PersonDto output = personApi.modify(input);
        //Traiter output
    }
    public void creerPersonne() {
        //Traider input
        PersonDto output = personApi.create(input);
        //Traiter output
    }

    L'API retourne ce genre de JSON :
    Code JSON : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    {
        code: 200,
        messages: [],
        data: {
            person: {name: "name", age: 100, ...}
        }
    }

    Probl�me, la gestion des erreurs est mal con�ue et l'API peut retourner un code HTTP 200 avec des donn�es tel que :
    Code JSON : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
        code: 400,
        messages: [
            severity: "ERROR",
            content: "Invalid character in 'name'"
        ],
        data: {
            person: {name: "א", age: 100, ...}
        }
    }

    Ce comportement ne pouvant pas changer, je souhaite m'adapter, mais si possible sans toucher au code existant (base de code assez grande).
    Les Aspects semblent �tre une bonne solution, j'en utilise d�j� pour log des appels de fonctions tr�s pr�cises.
    Je pense intercepter les donn�es de retour et envoyer une exception si le champ severity est "ERROR".

    Je voudrais savoir si il est possible d'intercepter le processus juste apr�s que la fonction ait retourn� le JSON (retour de personApi.create()) mais avant que la valeur soit assign�e � p output ?
    Sinon si il y existe une option plus pertinente ?

  2. #2
    Mod�rateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par d�faut
    Hello,

    il est pas clair quels sont les partis en pr�sence.

    Qu'est-ce qui est un programme serveur d'API qui tourne quelque part dans le monde, et qu'est-ce qui est un programme qui appelle cette API ? Y a-t-il d'autres programmes ? Quel est le programme que tu as besoin de modifier ? Les bouts de code que tu as montr� font partie de quel programme ?

    C'est quoi, p ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre �m�rite
    Avatar de Da�manu
    Homme Profil pro
    D�veloppeur touche � tout
    Inscrit en
    Janvier 2011
    Messages
    737
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur touche � tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 737
    Par d�faut
    L'API est est une API REST qui tourne sur un serveur, qui se mat�rialise dans le code par le service personApi.

    J'aimerais modifier mon programme, mais si possible sans toucher au code que j'ai pr�sent�.

    p est un mauvais-copier-coller, c'est output.

  4. #4
    Mod�rateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par d�faut
    ?

    Bah. Peut-�tre et peut-�tre pas. Si tu as d�j� utilis� des aspects tu dois avoir une id�e de comment �a marche n'est-ce pas ?

    Alors comment diable quelqu'un qui n'est pas toi, pourrait-il avoir la moindre id�e de si c'est possible, avec ce que tu nous montres ? Je trouve �trange qu'il y ait besoin de te dire �a, sans que �a te paraisse �vident d�s le d�part.

    Je veux dire, que ce soit possible, c'est pratiquement garanti, surtout qu'il existe des moyens de coller des aspects sur les m�thodes priv�es. Difficile d'imaginer que la mani�re dont personApi mat�rialise l'API ne rende pas �a possible d'une mani�re ou d'une autre.

    Mais concernant comment s'y prendre en pratique, il faut bien entendu regarder de quelle mani�re exacte cette API est mat�rialis�e, bref il faut regarder exactement ce que tu ne montres pas. Et c'est assez surprenant que �a ne t'ait pas saut� aux yeux je dois dire.

    Je voudrais savoir si il est possible d'intercepter le processus juste apr�s que la fonction ait retourn� le JSON (retour de personApi.create()) mais avant que la valeur soit assign�e � p output ?
    On rappellera qu'avec le code montr�, personApi.create() ne renvoie absolument pas du JSON, mais un objet PersonDto. Objet qui donc, vraisemblablement, ne contient pas les champs code ni message, ni d'ailleurs le status HTTP qui avait r�ellement �t� r�pondu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre tr�s actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    489
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 489
    Billets dans le blog
    5
    Par d�faut
    Le probl�me, c'est qu'il y a deux �coles sur les exceptions, celle de Java de base, qui est la mienne, et d�crite dans "Effective Java" (https://www.amazon.fr/Effective-Java.../dp/0134685997 ), et celle de Spring.

    Je pense que la vision Spring n'est pas bonne, mais c'est un avis perso.
    Effectivement, �a peut toujours mal se passer, soit parce que l'utilisateur envoie des donn�es incompl�tes, soit parce que la BDD tombe en panne ou que sais-je!

    Si on prend Spring, il n'y a pas d'exception dans la signature des m�thodes (exemple ici: https://docs.spring.io/spring-data/c...epository.html ).

    Or, ce n'est pas vrai. En r�alit�, si la BDD crash, alors Spring va renvoyer une RuntimeException ( https://docs.oracle.com/javase/8/doc...Exception.html ).

    Dans "Effective Java", au contraire (et dans le Java de base), on diff�rentie les exceptions.
    Il y a l'exception de base et la Runtime (celle envoy� par Spring) qui peut toujours �tre envoy�, n'importe quand.

    Il est conseill� de mettre dans la signature des m�thodes les exceptions qui peuvent �tre envoy� suite � une erreur "pr�visible" (Erreur de l'utilisateur, plantage de la BDD ...) et laisser la Runtime pour les erreurs du d�veloppeur (NullPointerException �tant la plus connue).

    Dans ton cas, je crains que l'on ai pas mis en avant l'exception dans la signature de la m�thode.
    Dans ce cas, on peut faire de la fa�on suivante:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public void modifierPersonne() throws ServiceException{
        try{  
          //Traider input
          PersonDto output = personApi.modify(input);
          //Traiter output
        }catch(Exception e){
            throw new MyException(e);
        }
    }
    public void creerPersonne() throws ServiceException{
        try{
          //Traider input
          PersonDto output = personApi.create(input);
         //Traiter output
        }catch(Exception e){
           throw new MyException(e);
        }
    }
    Ainsi, tu te laisse le soin d'avoir une gestion centralis�e des exceptions (g�n�ralement dans la couche controller).

    Tu peux aussi traiter l'�ventuelle exception dirrectement (en logant ...).

    A noter que l'"Exception" est vague. Dans la r�alit�; le personApi jette une RuntimeException. Elle est dans une logique Spring.

  6. #6
    Mod�rateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par d�faut
    C'est pas du tout le probl�me pr�sent� -_-�.

    Que tu n'aimes pas les RuntimeException �a te regarde et �a se d�fend, mais on est plus que probablement dans un cas o� la personne s'en tamponne si �a lui permet d'appliquer son id�e.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre �m�rite
    Avatar de Da�manu
    Homme Profil pro
    D�veloppeur touche � tout
    Inscrit en
    Janvier 2011
    Messages
    737
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur touche � tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 737
    Par d�faut
    Citation Envoy� par thelvin Voir le message
    Bah. Peut-�tre et peut-�tre pas. Si tu as d�j� utilis� des aspects tu dois avoir une id�e de comment �a marche n'est-ce pas ?

    Alors comment diable quelqu'un qui n'est pas toi, pourrait-il avoir la moindre id�e de si c'est possible, avec ce que tu nous montres ? Je trouve �trange qu'il y ait besoin de te dire �a, sans que �a te paraisse �vident d�s le d�part.
    �videmment, mais le seul usage des aspects que j'ai eu jusqu'� pr�sent �tait pour faire des logs d'appels de certaine fonctions pr�cises (avec @Before). L� je me doute que c'est possible avec des aspects, mais �a m'a l'air d'�tre un cas d'usage beaucoup plus sophistiqu�, puisqu'il faut que j'intercepte un appel. Et c'est �a que je ne savais pas faire lorsque j'ai �crit le post.

    Citation Envoy� par thelvin Voir le message
    On rappellera qu'avec le code montr�, personApi.create() ne renvoie absolument pas du JSON, mais un objet PersonDto. Objet qui donc, vraisemblablement, ne contient pas les champs code ni message, ni d'ailleurs le status HTTP qui avait r�ellement �t� r�pondu.
    Le champ code correspond au code HTTP, qui est donc dupliqu� dans le JSON. Sinon oui on est d'accord, le JSON est automatiquement converti en DTO, c'�tait peut-�tre un abus de langage de ma part.

    Cela dit, j'ai pu avancer dans l'intervalle de temps, j'ai trouv� @Around et ProceedingJoinPoint pjp; pjp.proceed() qui ont l'air de r�pondre � mon besoin.

    Code java : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
      @Around("appelApi()")
      public Object detecterErreurApi(ProceedingJoinPoint pjp) throws Throwable {
        Object reponseAPi = pjp.proceed();
        /**throw possible**/
        throw new ErreurApiException();
      }

    Mais �a me pose un nouveau souci. Si mon aspect lance une exception personnalis�e (ErreurApiException). �a provoque une erreur de compilation de type UndeclaredThrowableException car modifierPersonne n'a pas throws ErreurApiException d�clar�.
    Je pourrais lancer une exception standard, mais si possible j'aimerais garder mon exception.

  8. #8
    Membre chevronn�
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    348
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 348
    Par d�faut
    Malheureusement, si n'est pas une runtime et n'est pas dans la signature de �a na fonctionnera pas. Il faudrait transfomer l'exception en runtime pour que �a fonctionne (comme le sugg�re Thelvin).

    Si pas, vous laissez tomber l'aspect et faites un wrapper autour de cette API externe...

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par d�faut
    Pour ce qui est de lever une exception sans avoir � la d�clarer :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public final class ExceptionThrower{
        private ExceptionThrower(){}
     
        /**
         * 
         * @param ex
         */
        public static void throwException(final Throwable ex){
            ExceptionThrower.<RuntimeException>throwsUnchecked(ex);
        }
     
        /**
         * 
         * @param toThrow
         * @throws T
         */
    @SuppressWarnings("unchecked")
        private static <T extends Throwable> void throwsUnchecked(final Throwable toThrow) throws T {
            throw (T) toThrow;
        }
    }
    et donc au lieu de

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    throw new ErreurApiException();
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ExceptionThrower.throwException(new ErreurApiException());
    � vos risques et p�rils, cela va sans dire.

    Quant � l'id�e que "la gestion des erreurs est mal con�ue et l'API peut retourner un code HTTP 200 avec des donn�es tel que ..." c'est votre fa�on de voir�
    d'autres pourraient consid�rer que les erreurs business sont une r�ponse valide comme une autre et doivent �tre interpr�t�es par le client
    et que seules les erreurs de fonctionnement de /communication avec d
    oivent �tre retourn�es avec un code HTTP d'erreur.


Discussions similaires

  1. [struts-layout] couleur selon valeur ds collectionItem
    Par anassinou dans le forum Struts 1
    R�ponses: 3
    Dernier message: 07/07/2006, 09h10
  2. R�ponses: 3
    Dernier message: 13/06/2006, 16h36
  3. comment comparer les valeurs retourn�s par DBGrid
    Par Ice-tea dans le forum Bases de donn�es
    R�ponses: 2
    Dernier message: 08/06/2006, 14h42
  4. Ajout n lignes selon valeur...
    Par nicburger dans le forum Access
    R�ponses: 1
    Dernier message: 26/10/2005, 19h49
  5. affichage selon valeur entiere ou decimale
    Par Ankya dans le forum SQL Proc�dural
    R�ponses: 7
    Dernier message: 04/05/2005, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo