我是新来这个,努力实现阅读一些文档,但它不工作,请多多包涵。
我创建了一个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
。
您需要注释与你的异常映射@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();
}
}
我最常做的时候创建的API是创造我自己的异常,从扩展RuntimeException的 ,所以我不必赶我的异常。
下面是一个例子:
注 :我使用的JAX-RS与泽西
第一 :创建自己的异常,从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");
一个小的话,尽量使用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();
}