JAX-RS 球衣异常映射器用户定义异常

2022-09-01 04:31:39

我是新手,试图实现阅读一些文档,但它不起作用,请忍受我。

我创建了一个这样的用法:UserNotFoundMapperExceptionMappers

public class UserNotFoundMapper implements ExceptionMapper<UserNotFoundException> {

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

}

这在我的服务中:

@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();
}

这是一个例外。UserNotFoundExceptionUser-Defined

我试过这个:

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

但是当我调用服务时,不会被调用。看来我可能错过了一些东西。那么如何定义这个例外呢?UserDefinedExceptionMapperUserDefinedException

请让我知道如何定义 .UserNotFoundException


答案 1

您需要使用@Provider注释异常映射器,否则它永远不会注册到 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();
    }
}

答案 2

在创建 API 时,我通常做的是创建自己的异常,该异常从 RuntimeException 扩展而来,因此我不一定必须捕获我的异常。

下面是一个示例:

注意:我正在将 JAX-RS 与泽西岛一起使用

首先:创建我自己的 Exception,从 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;
}

}

还实现异常映射器

@Provider
public class ExceptionName implements ExceptionMapper<ExceptionName>{

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

}

每次我想抛出一个异常时,我都会在任何地方这样做,异常映射器将负责向使用API的客户端返回响应。

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