Exception Jersey的异常侦听器

Exception Jersey的异常侦听器,exception,jersey,listener,handler,resolver,Exception,Jersey,Listener,Handler,Resolver,我有一个Jersey(2.14)应用程序,它可以正常工作。我有一些服务在那里运行。现在我想配置ServletContainer,以便拦截任何未捕获的异常,并将其记录或通过电子邮件发送到某处 我已经有了ApplicationEventListener的一个实现和一个用于生成异常的测试端点 这是应该生成异常的方法(这正在工作:-): @GET @路径(测试异常) 公共字符串testException(@Context final ServletContext){ 字符串s=null; int siz

我有一个Jersey(2.14)应用程序,它可以正常工作。我有一些服务在那里运行。现在我想配置ServletContainer,以便拦截任何未捕获的异常,并将其记录或通过电子邮件发送到某处

我已经有了ApplicationEventListener的一个实现和一个用于生成异常的测试端点

这是应该生成异常的方法(这正在工作:-):

@GET
@路径(测试异常)
公共字符串testException(@Context final ServletContext){
字符串s=null;
int size=0;
如果(System.nanoTime()%10!=0){
s=零;
}否则{
s=“不会发生异常”;
}
尺寸=s.长度();
返回整数.toString(size)+“:”+s;
}
如果我的ApplicationEventListener:

公共类MyApplicationEventListener实现ApplicationEventListener{
私有瞬态易失性整数计数=0;
私有int异常=0;
@凌驾
public void OneEvent(最终应用程序Event应用程序Event){
ApplicationEvent.Type类型=ApplicationEvent.getType();
}
@凌驾
公共RequestEventListener onRequest(最终RequestEvent RequestEvent){
RequestEvent.Type Type=RequestEvent.getType();
if(type==RequestEvent.type.ON_异常){
例外情况++;
}
计数++;
返回null;
}
}
这是my web.xml中的配置:


泽西servlet
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com…休息
jersey.config.server.provider.classnames
com…filter.MyApplicationEventListener
jersey.config.server.tracing
全部的
1.
OneEvent()和onRequest()都被调用,但是当异常发生时,我不会得到ON_异常,而是一个开始

我做错了什么?或者,我如何获得由Jersey服务的方法产生的所有异常


我想制作一些类似Spring的HandlerExceptionResolver的东西。

使用ExceptionMapper,您可以很容易地完成这项工作。如果发生异常,您仍然应该将响应发送回客户端。但在这里,你也可以发送电子邮件或记录机票等

下面是我为ConstraintViolations做的一个示例,但这可以是类型exception的异常映射器。您可以检查异常的类型并相应地执行某些操作。在toResponse中,您可以实现notfiyEmail方法,该方法可以将堆栈跟踪和消息发送到电子邮件地址,例如,或者记录我过去所做的jira记录。但是请注意,您需要在顶部添加@Provider,并告诉您的rest应用程序/ResourceConfig扫描该类的包。或者,您可以使用ResourceConfig手动注册它

@Provider
public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

    private static final Logger logger = Logger.getLogger(ConstraintViolationExceptionMapper.class.getName());

    public Response toResponse(ConstraintViolationException exception) {            
            final int violationCount = exception.getConstraintViolations().size();

            ConstraintViolation<?>[] constraintViolations = exception.getConstraintViolations().toArray(
                    new ConstraintViolation<?>[violationCount]);
            Violation[] violations = new Violation[exception.getConstraintViolations().size()];

            for (int i = 0; i < violationCount; i++) {
                ConstraintViolation<?> cv = constraintViolations[i];
                Violation violation = new Violation(cv.getPropertyPath().toString(), cv.getMessage());
                violations[i] = violation;
            }

            ConstraintErrorResponse responseEntity = new ConstraintErrorResponse();
            responseEntity.setViolations(violations);

            logger.info("Seinding exception response");
            return Response.status(Response.Status.BAD_REQUEST).entity(responseEntity).build();
    }
}
@Provider
公共类ConstraintViolationExceptionMapper实现ExceptionMapper{
私有静态最终记录器Logger=Logger.getLogger(ConstraintViolationExceptionMapper.class.getName());
公共响应(ConstraintViolationException异常){
final int violationCount=exception.getConstraintViolations().size();
ConstraintViolation[]constraintViolations=exception.getConstraintViolations().toArray(
新的约束约束[violationCount];
违规[]违规=新违规[exception.getConstraintViolations().size()];
对于(int i=0;i
使用ExceptionMapper,您可以非常轻松地完成此操作。如果发生异常,您仍然应该将响应发送回客户端。但在这里,你也可以发送电子邮件或记录机票等

下面是我为ConstraintViolations做的一个示例,但这可以是类型exception的异常映射器。您可以检查异常的类型并相应地执行某些操作。在toResponse中,您可以实现notfiyEmail方法,该方法可以将堆栈跟踪和消息发送到电子邮件地址,例如,或者记录我过去所做的jira记录。但是请注意,您需要在顶部添加@Provider,并告诉您的rest应用程序/ResourceConfig扫描该类的包。或者,您可以使用ResourceConfig手动注册它

@Provider
public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

    private static final Logger logger = Logger.getLogger(ConstraintViolationExceptionMapper.class.getName());

    public Response toResponse(ConstraintViolationException exception) {            
            final int violationCount = exception.getConstraintViolations().size();

            ConstraintViolation<?>[] constraintViolations = exception.getConstraintViolations().toArray(
                    new ConstraintViolation<?>[violationCount]);
            Violation[] violations = new Violation[exception.getConstraintViolations().size()];

            for (int i = 0; i < violationCount; i++) {
                ConstraintViolation<?> cv = constraintViolations[i];
                Violation violation = new Violation(cv.getPropertyPath().toString(), cv.getMessage());
                violations[i] = violation;
            }

            ConstraintErrorResponse responseEntity = new ConstraintErrorResponse();
            responseEntity.setViolations(violations);

            logger.info("Seinding exception response");
            return Response.status(Response.Status.BAD_REQUEST).entity(responseEntity).build();
    }
}
@Provider
公共类ConstraintViolationExceptionMapper实现ExceptionMapper{
私有静态最终记录器Logger=Logger.getLogger(ConstraintViolationExceptionMapper.class.getName());
公共响应(ConstraintViolationException异常){
final int violationCount=exception.getConstraintViolations().size();
ConstraintViolation[]constraintViolations=exception.getConstraintViolations().toArray(
新的约束约束[violationCount];
违规[]违规=新违规[exception.getConstraintViolations().size()];
对于(int i=0;i