我是新手,试图阅读一些文档,但它不起作用,请耐心等待。
我使用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();
}
UserNotFoundException
是User-Defined
例外。
我试过了:
public class UserNotFoundException extends Exception {
//SOME block of code
}
但是当我调用服务时,UserDefinedExceptionMapper
没有被调用。似乎我可能会遗漏UserDefinedException
中的某些内容。那么如何定义这个异常?
请告诉我如何定义UserNotFoundException
。
答案 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(); }