0

我们有使用 spring 和 cxf 的 rest webservices。当一个检查异常被抛出时,我们通过soap ui得到正确的本地化异常。

但是,当抛出未经检查的运行时异常时,我们只会得到一个堆栈跟踪,说明 Web 服务无法加载。

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class WebServiceExceptionWrapper extends Exception {

    /** Type (class name). */
    private String type;

    /** Message. */
    private String message;

    /** Stack trace. */
    private StackTraceElement[] stackTrace;

    /** Cause. */
    private Throwable cause;

    /** The localized message. */
    private String localeErrorCode;

    /**
     * Construct a wrapper around an exception.
     * 
     * @param e exception
     */
    public WebServiceExceptionWrapper(final Exception e) {
        this.type = e.getClass().getName();
        this.message = StringEscapeUtils.escapeHtml(e.getLocalizedMessage());
        this.stackTrace = e.getStackTrace();
        this.cause = e.getCause();
        if(e instanceof DetailedException) {
            this.localeErrorCode = StringEscapeUtils.escapeHtml(((DetailedException) e).getLocaleErrorCode());
        }
    }

    /**
     * Gets the type.
     * 
     * @return the type
     */
    @XmlElement(nillable = true)
    public String getType() {
        return this.type;
    }

    /**
     * Sets the type.
     * 
     * @param type the type to set
     */
    public void setType(final String type) {
        this.type = type;
    }

    /**
     * Gets the message.
     * 
     * @return the message
     */
    @XmlElement(nillable = true)
    public String getMessage() {
        return this.message;
    }

    /**
     * Sets the message.
     * 
     * @param message the message to set
     */
    public void setMessage(final String message) {
        this.message = message;
    }

    /**
     * Gets the stackTrace.
     * 
     * @return the stackTrace
     */
    @XmlElement(nillable = true)
    public StackTraceElement[] getStackTrace() {
        return this.stackTrace;
    }

    /**
     * Sets the stackTrace.
     * 
     * @param stackTrace the stackTrace to set
     */
    public void setStackTrace(final StackTraceElement[] stackTrace) {
        this.stackTrace = stackTrace;
    }

    /**
     * Gets the cause.
     * 
     * @return the cause
     */
    @XmlElement(nillable = true)
    public Throwable getCause() {
        return this.cause;
    }

    /**
     * Sets the cause.
     * 
     * @param cause the cause to set
     */
    public void setCause(final Throwable cause) {
        this.cause = cause;
    }

    /**
     * @return the localeErrorCode
     */
    @XmlElement(nillable = true)
    public String getLocaleErrorCode() {
        return this.localeErrorCode;
    }

    /**
     * @param localeErrorCode the localeErrorCode to set
     */
    public void setLocaleErrorCode(final String localeErrorCode) {
        this.localeErrorCode = localeErrorCode;
    }

我如何防止返回堆栈跟踪。我只想要一个响应代码和一个响应消息。

4

1 回答 1

1

使用 Apache-CXF 在 JAX-RS Web 服务中处理异常流的最简单方法是通过标有 @Provider 注释的 javax.ws.rs.ext.ExceptionMapper 类(或在 jaxrs:server 的 Provider 部分(jaxrs:providers ). 然后,您可以捕获要返回特定状态代码的特定异常,例如:

@Provider
public class FooExceptionMapper implements ExceptionMapper<FooException>  {

    @Override
    public Response toResponse(FooException exception) {
        ... do your work you want to maybe do here
        return Response.status(Response.Status.BAD_REQUEST).entity(...whatever...).build();
    }
}

现在您为这个映射器创建一个 bean(或使用注释驱动),将它绑定到您的服务方法,然后捕获您的异常。在你的 catch 块中简单地抛出这个并让 cxf 的拦截器框架接管。

于 2013-04-24T20:16:36.383 回答