Cxf Mapper或拦截器无权访问原始错误消息

时间:2016-10-29 00:15:37

标签: java cxf

我有一个使用spring和cxf的Java rest web服务,我正在尝试将错误消息从我的WS层传播到我的Grails / Groovy前端。我的前端通过引用webservice的client-spring调用web服务。

我有一个被调用的异常映射器,当我发出REST请求时,我得到了错误消息,但是在使用我假设使用代理的前端时,错误消息不可用。

我也尝试过使用拦截器,它会被调用,但是会调用    message.getContent(Exception.class) 返回null。

使用调试器跟踪异常时,消息似乎丢失了 调用ServiceInvokerInterceptor时。

我使用cxf 2.4,但是当我们升级到3.0时功能已被删除,现在尝试将其恢复,我不确定我是否遗漏了某些内容,或者cxf是否有改变。

我能让客户正确做的唯一事情是触发 ResponseExceptionMapper,但我无法从响应对象中获取原始异常。

这是前端的典型堆栈跟踪。

HTTP 500 Internal Server Error. Stacktrace follows:
Message: HTTP 500 Internal Server Error
    Line | Method
->>   14 | fromResponse        in com.company.common.web.RestResponseExceptionMapper
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|      9 | fromResponse        in     ''
|    302 | checkResponse . . . in org.apache.cxf.jaxrs.client.ClientProxyImpl
|    725 | handleResponse      in     ''
|    683 | doChainedInvocation in     ''
|    224 | invoke              in     ''

我已经写了3个与此问题相关的其他问题,而且我一直在努力解决这个问题。

1 个答案:

答案 0 :(得分:0)

尝试ExceptionMapper课程。如果您只使用REST服务,那么它就是完美的解决方案。

这是一个示例

import java.io.PrintWriter;
import java.io.StringWriter;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.ext.ExceptionMapper;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;

@Component
public class RestExceptionMapper implements ExceptionMapper<Throwable> {
    public final String exceptionMessagePrefix = "Exception at server.";

    @Override
    public Response toResponse(Throwable exception) {
        String stackTrace = getStackTrace(exception);

        ResponseBuilder builder = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
        builder.entity(stackTrace);
        builder.header("Content-Type", MediaType.TEXT_PLAIN_VALUE);

        return builder.build();
    }

    public String getStackTrace(Throwable ex) {
        StringWriter stringWriter = new StringWriter();
        PrintWriter out = new PrintWriter(stringWriter);

        ex.printStackTrace(out);//Only if you want it to output to console

        stringWriter.close();
        out.close();

        return stringWriter.toString();
    }
}