JAX-RS球衣ExceptionMappers用户定义的异常(JAX-RS jersey Exce

2019-07-20 21:30发布

我是新来这个,努力实现阅读一些文档,但它不工作,请多多包涵。

我创建了一个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

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


Answer 2:

我最常做的时候创建的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");


Answer 3:

一个小的话,尽量使用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();
    }



文章来源: JAX-RS jersey ExceptionMappers User-Defined Exception