web-dev-qa-db-fra.com

gestion des exceptions client feinte de printemps

J'ai un client fiegn pour envoyer une autre demande de micro service.

@FeignClient(name="userservice")
public interface UserClient {

    @RequestMapping(
            method= RequestMethod.GET,
                      path = "/userlist")
    String getUserByid(@RequestParam(value ="id") String id);

}

Maintenant, j'envoie une demande comme celle-ci

try {
    String responseData = userClient.getUserByid(id);
    return responseData;
    }

catch(FeignException e)
 {
 logger.error("Failed to get user", id);
}

catch (Exception e) 
{
 logger.error("Failed to get user", id);
}

Ici, le problème est que si une FeignException se produit, je ne reçois aucun code d'erreur.

Je dois envoyer un code d'erreur correspondant dans un autre APIS pour l'envoyer à l'appelant

Alors, comment extraire le code d'erreur? Je veux extraire le code d'erreur et créer une réponse

J'ai obtenu ce code mais je ne sais pas exactement comment je peux utiliser dans ma fonction.

3
kcoder

avez-vous essayé d'implémenter FallbackFactory sur votre faux client?

https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#spring-cloud-feign-hystrix-fallback

Sur la méthode create, avant le retour, vous pouvez récupérer le code d'état http avec cet extrait:

String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";

Exemple:

@FeignClient(name="userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {

    @RequestMapping(
            method= RequestMethod.GET,
                      path = "/userlist")
    String getUserByid(@RequestParam(value ="id") String id);

}


@Component
static class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {

     String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";

     return new UserClient() {
        @Override
        public String getUserByid() {
            logger.error(httpStatus);
            // what you want to answer back (logger, exception catch by a ControllerAdvice, etc)
        }
    };
}

}

1
rphlmr

Pas le même problème, mais cela a aidé dans ma situation. La FeignException d'OpenFeign ne se lie pas à un état HTTP spécifique (c'est-à-dire qu'elle n'utilise pas l'annotation @ResponseStatus de Spring), ce qui fait de Spring la valeur par défaut de 500 chaque fois qu'elle est confrontée à une FeignException. C'est correct car une FeignException peut avoir de nombreuses causes qui ne peuvent pas être liées à un état HTTP particulier.

Cependant, vous pouvez modifier la façon dont Spring gère les FeignExceptions. Définissez simplement un ExceptionHandler qui gère la FeignException

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(FeignException.class)
    public String handleFeignStatusException(FeignException e, HttpServletResponse response) {
        response.setStatus(e.status());
        return "feignError";
    }

}

Cet exemple fait que Spring retourne le même statut HTTP que vous avez reçu

1
Srinath