web-dev-qa-db-fra.com

Maillot JAX-RS ExceptionMappers Exception définie par l'utilisateur

Je suis nouveau dans ce domaine, j'essaie de lire certains documents, mais cela ne fonctionne pas, veuillez être patient.

J'ai créé un UserNotFoundMapper en utilisant ExceptionMappers comme ceci:

public class UserNotFoundMapper implements ExceptionMapper<UserNotFoundException> {

@Override
public Response toResponse(UserNotFoundException ex) {
    return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}

}

Ceci à mon service:

@GET
@Path("/user")
public Response getUser(@QueryParam("id") String id) throws UserNotFoundException{
    //Some user validation code with DB hit, if not found then
    throw new UserNotFoundException();
}

UserNotFoundException est un User-Defined Exception.

J'ai essayé ceci:

public class UserNotFoundException extends Exception {
       //SOME block of code 
}

Mais lorsque j'appelle le service, le UserDefinedExceptionMapper n'est pas appelé. Il semble que je manque peut-être quelque chose dans le UserDefinedException. Comment définir cette exception alors?

Veuillez me faire savoir comment définir le UserNotFoundException.

37
WhoAmI

Vous devez annoter votre mappeur d'exceptions avec @Provider , sinon il ne sera jamais enregistré avec le runtime JAX-RS.

@Provider
public class UserNotFoundMapper implements
        ExceptionMapper<UserNotFoundException> {
    @Override
    public Response toResponse(UserNotFoundException ex) {
        return Response.status(404).entity(ex.getMessage()).type("text/plain")
                .build();
    }
}
56
Perception

Ce que je fais habituellement lors de la création d'API est de créer ma propre exception qui s'étend de RuntimeException donc je n'ai pas nécessairement à intercepter mon exception.

Voici un exemple:

[~ # ~] note [~ # ~] : j'utilise JAX-RS avec Jersey

Tout d'abord : créer ma propre exception qui s'étend de RuntimeException.

public class ExceptionName extends RuntimeException {

private int code;
private String message;

public int getCode(){
    return code;
}

public String getMessage(){
    return message;
}

public ExceptionName(int code, String message) {
    this.code = code;
    this.message = message;
}

}

Implémentez également un ExceptionMapper

@Provider
public class ExceptionName implements ExceptionMapper<ExceptionName>{

    @Override
    public Response toResponse(ExceptionName exception) {
        return Response.status(exception.getCode()).entity(exception.getMessage()).build();
    }

}

Et chaque fois que je veux lever une exception, je le fais comme ça n'importe où, le mappeur d'exceptions se charge de renvoyer une réponse au client consommant l'API

throw new ExceptionName(500,"there was an error with something here");
1
Nicolas Frugoni