我有一个使用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个与此问题相关的其他问题,而且我一直在努力解决这个问题。
答案 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();
}
}