Exception handling 如何防止JAX.RS ExceptionMapper包括stacktrace

Exception handling 如何防止JAX.RS ExceptionMapper包括stacktrace,exception-handling,jax-rs,Exception Handling,Jax Rs,我的JAX.RS ExceptionMapper中有以下代码: @Override public Response toResponse(ResponseStatusCodeException ex) { ResponseStatusCode newEx = new ResponseStatusCode(ex); return Response.status(ex.getStatus()).entity(newEx).type(MediaType.APPLICATION_JSON

我的JAX.RS ExceptionMapper中有以下代码:

@Override
public Response toResponse(ResponseStatusCodeException ex) {
    ResponseStatusCode newEx = new ResponseStatusCode(ex);
    return Response.status(ex.getStatus()).entity(newEx).type(MediaType.APPLICATION_JSON).build();
}
这将生成一个JSON响应,其中包括从response.status()行开始的完整异常堆栈跟踪

如何创建ExceptionMapper来返回newEx类的JSON编码属性。我甚至尝试将ResponseStatusCode设置为POJO而不是扩展异常,但堆栈跟踪始终包含在响应中

我正在使用WebSphereLiberty概要文件8.5.5.8

谢谢

编辑:让我添加生成的JSON:

{
    "message": "Language en is not currently available",
    "status": 500,
    "username": "901353fa-b43e-4e86-b12f-6d502a9e8a78",
    "localizedMessage": "Language en is not currently available",
    "stackTrace": [
        {
            "fileName": "ResponseStatusCodeExceptionHandler.java",
            "lineNumber": 14,
            "className": "com.servengine.ws.rs.ResponseStatusCodeExceptionHandler",
            "methodName": "toResponse",
            "nativeMethod": false
        },
        {
            "fileName": "ResponseStatusCodeExceptionHandler.java",
            "lineNumber": 1,
            "className": "com.servengine.ws.rs.ResponseStatusCodeExceptionHandler",
            "methodName": "toResponse",
            "nativeMethod": false
        },
        {
            "fileName": "ExceptionUtils.java",
            "lineNumber": 90,
            "className": "org.apache.cxf.jaxrs.utils.ExceptionUtils",
            "methodName": "convertFaultToResponse",
            "nativeMethod": false
        },
        {
            "fileName": "JAXRSUtils.java",
            "lineNumber": 1621,
            "className": "org.apache.cxf.jaxrs.utils.JAXRSUtils",
            "methodName": "convertFaultToResponse",
            "nativeMethod": false
        },
        {
            "fileName": "JAXRSInvoker.java",
            "lineNumber": 324,
            "className": "org.apache.cxf.jaxrs.JAXRSInvoker",
            "methodName": "handleFault",
            "nativeMethod": false
        },
        {
            "fileName": "JAXRSInvoker.java",
            "lineNumber": 213,
            "className": "org.apache.cxf.jaxrs.JAXRSInvoker",
            "methodName": "invoke",
            "nativeMethod": false
        },
        {
            "fileName": "LibertyJaxRsInvoker.java",
            "lineNumber": 366,
            "className": "com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker",
            "methodName": "invoke",
            "nativeMethod": false
        },
        {
            "fileName": "JAXRSInvoker.java",
            "lineNumber": 99,
            "className": "org.apache.cxf.jaxrs.JAXRSInvoker",
            "methodName": "invoke",
            "nativeMethod": false
        },
        {
            "fileName": "ServiceInvokerInterceptor.java",
            "lineNumber": 59,
            "className": "org.apache.cxf.interceptor.ServiceInvokerInterceptor$1",
            "methodName": "run",
            "nativeMethod": false
        },
        {
            "fileName": "ServiceInvokerInterceptor.java",
            "lineNumber": 96,
            "className": "org.apache.cxf.interceptor.ServiceInvokerInterceptor",
            "methodName": "handleMessage",
            "nativeMethod": false
        },
        {
            "fileName": "PhaseInterceptorChain.java",
            "lineNumber": 307,
            "className": "org.apache.cxf.phase.PhaseInterceptorChain",
            "methodName": "doIntercept",
            "nativeMethod": false
        },
        {
            "fileName": "ChainInitiationObserver.java",
            "lineNumber": 124,
            "className": "org.apache.cxf.transport.ChainInitiationObserver",
            "methodName": "onMessage",
            "nativeMethod": false
        },
        {
            "fileName": "AbstractHTTPDestination.java",
            "lineNumber": 256,
            "className": "org.apache.cxf.transport.http.AbstractHTTPDestination",
            "methodName": "invoke",
            "nativeMethod": false
        },
        {
            "fileName": "AbstractJaxRsWebEndpoint.java",
            "lineNumber": 134,
            "className": "com.ibm.ws.jaxrs20.endpoint.AbstractJaxRsWebEndpoint",
            "methodName": "invoke",
            "nativeMethod": false
        },
        {
            "fileName": "IBMRestServlet.java",
            "lineNumber": 149,
            "className": "com.ibm.websphere.jaxrs.server.IBMRestServlet",
            "methodName": "handleRequest",
            "nativeMethod": false
        },
        {
            "fileName": "IBMRestServlet.java",
            "lineNumber": 107,
            "className": "com.ibm.websphere.jaxrs.server.IBMRestServlet",
            "methodName": "doPost",
            "nativeMethod": false
        },
        {
            "fileName": "HttpServlet.java",
            "lineNumber": 707,
            "className": "javax.servlet.http.HttpServlet",
            "methodName": "service",
            "nativeMethod": false
        },
        {
            "fileName": "IBMRestServlet.java",
            "lineNumber": 99,
            "className": "com.ibm.websphere.jaxrs.server.IBMRestServlet",
            "methodName": "service",
            "nativeMethod": false
        },
        {
            "fileName": "ServletWrapper.java",
            "lineNumber": 1287,
            "className": "com.ibm.ws.webcontainer.servlet.ServletWrapper",
            "methodName": "service",
            "nativeMethod": false
        },
        {
            "fileName": "ServletWrapper.java",
            "lineNumber": 778,
            "className": "com.ibm.ws.webcontainer.servlet.ServletWrapper",
            "methodName": "handleRequest",
            "nativeMethod": false
        },
        {
            "fileName": "ServletWrapper.java",
            "lineNumber": 475,
            "className": "com.ibm.ws.webcontainer.servlet.ServletWrapper",
            "methodName": "handleRequest",
            "nativeMethod": false
        },
        {
            "fileName": "WebAppFilterChain.java",
            "lineNumber": 146,
            "className": "com.ibm.ws.webcontainer.filter.WebAppFilterChain",
            "methodName": "invokeTarget",
            "nativeMethod": false
        },
        {
            "fileName": "WebAppFilterChain.java",
            "lineNumber": 78,
            "className": "com.ibm.ws.webcontainer.filter.WebAppFilterChain",
            "methodName": "doFilter",
            "nativeMethod": false
        },
        {
            "fileName": "WebAppFilterManager.java",
            "lineNumber": 1020,
            "className": "com.ibm.ws.webcontainer.filter.WebAppFilterManager",
            "methodName": "doFilter",
            "nativeMethod": false
        },
        {
            "fileName": "WebAppFilterManager.java",
            "lineNumber": 1142,
            "className": "com.ibm.ws.webcontainer.filter.WebAppFilterManager",
            "methodName": "invokeFilters",
            "nativeMethod": false
        },
        {
            "fileName": "CacheServletWrapper.java",
            "lineNumber": 81,
            "className": "com.ibm.ws.webcontainer.servlet.CacheServletWrapper",
            "methodName": "__handleRequest",
            "nativeMethod": false
        },
        {
            "fileName": "CacheServletWrapper.java",
            "lineNumber": -1,
            "className": "com.ibm.ws.webcontainer.servlet.CacheServletWrapper",
            "methodName": "handleRequest",
            "nativeMethod": false
        },
        {
            "fileName": "WebContainer.java",
            "lineNumber": 928,
            "className": "com.ibm.ws.webcontainer.WebContainer",
            "methodName": "handleRequest",
            "nativeMethod": false
        },
        {
            "fileName": "DynamicVirtualHost.java",
            "lineNumber": 262,
            "className": "com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2",
            "methodName": "run",
            "nativeMethod": false
        },
        {
            "fileName": "HttpDispatcherLink.java",
            "lineNumber": 955,
            "className": "com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper",
            "methodName": "run",
            "nativeMethod": false
        },
        {
            "fileName": "HttpDispatcherLink.java",
            "lineNumber": 341,
            "className": "com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink",
            "methodName": "ready",
            "nativeMethod": false
        },
        {
            "fileName": "HttpInboundLink.java",
            "lineNumber": 470,
            "className": "com.ibm.ws.http.channel.internal.inbound.HttpInboundLink",
            "methodName": "handleDiscrimination",
            "nativeMethod": false
        },
        {
            "fileName": "HttpInboundLink.java",
            "lineNumber": 404,
            "className": "com.ibm.ws.http.channel.internal.inbound.HttpInboundLink",
            "methodName": "handleNewRequest",
            "nativeMethod": false
        },
        {
            "fileName": "HttpInboundLink.java",
            "lineNumber": 284,
            "className": "com.ibm.ws.http.channel.internal.inbound.HttpInboundLink",
            "methodName": "processRequest",
            "nativeMethod": false
        },
        {
            "fileName": "HttpInboundLink.java",
            "lineNumber": 255,
            "className": "com.ibm.ws.http.channel.internal.inbound.HttpInboundLink",
            "methodName": "ready",
            "nativeMethod": false
        },
        {
            "fileName": "NewConnectionInitialReadCallback.java",
            "lineNumber": 174,
            "className": "com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback",
            "methodName": "sendToDiscriminators",
            "nativeMethod": false
        },
        {
            "fileName": "NewConnectionInitialReadCallback.java",
            "lineNumber": 83,
            "className": "com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback",
            "methodName": "complete",
            "nativeMethod": false
        },
        {
            "fileName": "WorkQueueManager.java",
            "lineNumber": 504,
            "className": "com.ibm.ws.tcpchannel.internal.WorkQueueManager",
            "methodName": "requestComplete",
            "nativeMethod": false
        },
        {
            "fileName": "WorkQueueManager.java",
            "lineNumber": 574,
            "className": "com.ibm.ws.tcpchannel.internal.WorkQueueManager",
            "methodName": "attemptIO",
            "nativeMethod": false
        },
        {
            "fileName": "WorkQueueManager.java",
            "lineNumber": 929,
            "className": "com.ibm.ws.tcpchannel.internal.WorkQueueManager",
            "methodName": "workerRun",
            "nativeMethod": false
        },
        {
            "fileName": "WorkQueueManager.java",
            "lineNumber": 1018,
            "className": "com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker",
            "methodName": "run",
            "nativeMethod": false
        },
        {
            "fileName": "ThreadPoolExecutor.java",
            "lineNumber": 1142,
            "className": "java.util.concurrent.ThreadPoolExecutor",
            "methodName": "runWorker",
            "nativeMethod": false
        },
        {
            "fileName": "ThreadPoolExecutor.java",
            "lineNumber": 617,
            "className": "java.util.concurrent.ThreadPoolExecutor$Worker",
            "methodName": "run",
            "nativeMethod": false
        },
        {
            "fileName": "Thread.java",
            "lineNumber": 745,
            "className": "java.lang.Thread",
            "methodName": "run",
            "nativeMethod": false
        }
    ],
    "suppressed": [
    ]
}
和POJO:

package com.servengine.ws.rs;

public class ResponseStatusCode extends Exception {
    private static final long serialVersionUID = 1L;

    private int status;
    private String message, username, code;

    public ResponseStatusCode(ResponseStatusCodeException exception) {
        this.message = exception.getMessage();
        this.username = exception.getUsername();
        this.code = exception.getCode();
        this.status = exception.getStatus();
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

如果要封送到JSON的类扩展异常,则将包括堆栈跟踪。我将其更改为Serializable,但我还没有这样做,并且没有包含堆栈跟踪

非常感谢@peeskillet的回复。

如果您正在使用封送POJO到JSON,您可以尝试以下方法:

@JsonIgnoreProperties(value = "stackTrace")
public class ResponseStatusCode extends Exception

属性通常使用getter序列化。你在pojo中有异常或其他东西的getter吗?谢谢。我只是包含了POJO,它没有异常信息,所以我不知道生成的JSON中的堆栈跟踪来自何处。您继承了super class的所有getter
exception/Throwable
为什么我们需要使POJO扩展异常?如果这是必需的,那么您应该制作一个不同的POJO类或使用Jackson Mixin或其他东西。谢谢peeskillet。这就是问题所在。如果要封送到JSON extends异常的类,将包括堆栈跟踪。我将其移动到(序列化),如原始问题中所解释的,我还没有这样做,并且没有包括堆栈跟踪。