JAX-RS jersey ExceptionMappers用户定义的异常

时间:2013-03-03 11:44:38

标签: java web-services rest jersey jax-rs

我是新手,试图阅读一些文档,但它不起作用,请耐心等待。

我使用UserNotFoundMapper创建了ExceptionMappers,如下所示:

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 
}

但是当我调用服务时,UserDefinedExceptionMapper没有被调用。似乎我可能会遗漏UserDefinedException中的某些内容。那么如何定义这个异常?

请告诉我如何定义UserNotFoundException

3 个答案:

答案 0 :(得分:55)

您需要使用@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();
    }
}

答案 1 :(得分:1)

创建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;
}

}

同时实施ExceptionMapper

@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");

答案 2 :(得分:-1)

一个小注释,尝试使用Response.Status.NOT_FOUND而不是使用404等。代码将更具可读性,更不容易出现拼写错误,“text / plain”也是如此。下面是您提到的将处理异常的代码。 哦,还有一件事要记住在界面中注释你的方法@Produces(MediaType.TEXT_PLAIN)


    public class UserNotFoundException extends Exception {
        //...
    }

    public class UserServiceImpl implements UserService {

        @Override 
        public Response getUser(@QueryParam("id") String id) {
            final Response response;
            try{
                // call user method
                //if everything is ok
                response = Response.status(Response.Status.OK).entity(whateverYouWant).type(MediaType.TEXT_PLAIN).build();
            } catch(UserNotFoundException ex) {         
                response = new UserNotFoundMapper().toResponse(ex);
            }

            return response;
        }
    }

    In client slide you can check 

    public static boolean isUserExists(final Response serverResp) {
        return serverResp != null && serverResp.getStatus() == Response.Status.NOT_FOUND.getStatusCode();
    }