gpt4 book ai didi

gwt - 创建供 GWT 客户端使用的 cxf REST json-p 服务的最佳方法

转载 作者:行者123 更新时间:2023-12-02 07:29:35 24 4
gpt4 key购买 nike

我们正在实现一个使用 CXF 和 Spring 返回 json-p 的 REST api。该服务应与 GWT 客户端配合使用。 GWT 客户端使用 JsonpRequestBuilder 调用服务。它传入两个函数名称,一个在成功的情况下应包装响应,另一个在失败的情况下包装响应。

调用 URL 可能如下所示: http://our.server.com/restservice?parameter=value...parameter=value&_jsonp=success_callback&_jsonp_failure=failure_callback

当服务抛出异常(服务失败)时,我想返回状态为 200 的 HTTP 响应,其中包含异常消息。我不使用标准 jsonp 拦截器(JsonpPreStreamInterceptor 和 JsonpPostStreamInterceptor)的原因是,如果抛出异常,我想将响应正文包装在不同的函数中。这样我的客户端(使用 GWT 构建)就可以识别出发生了错误。

我编写了一个映射器来将异常转换为如下所示的响应:

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

import cfpfelles.WebServiceException;

@Provider
public class WebServiceExceptionMapper implements ExceptionMapper<WebServiceException> {

public Response toResponse(WebServiceException arg0) {

return Response.status(Response.Status.OK).
type("application/x+javascript").
entity("Exception: " + arg0.getMessage()).
build();

}

}

我有一个流内拦截器,它将成功和失败回调名称存储在消息对象的交换部分中,以便输出拦截器可以访问它们。它看起来像这样:

public void handleMessage(Message message) throws Fault {
String callbackValue = getCallbackValue(message);
if (!callbackValue.isEmpty()) {
if (getAcceptType() != null)
{
message.put("Accept", getAcceptType());
}
message.getExchange().put(CALLBACK_KEY, callbackValue);
}

// failure callback value
String failureCallbackValue = getFailureCallbackValue(message);
if (!failureCallbackValue.isEmpty()) {
message.getExchange().put(FAILURE_CALLBACK_KEY, failureCallbackValue);
}
}

我有一个带有handleMessage方法的预流拦截器,如下所示:

public void handleMessage(Message message) throws Fault {

HttpServletResponse response = (HttpServletResponse) message
.get("HTTP.RESPONSE");
try {
response.getOutputStream().write("callback(".getBytes("UTF-8"));
} catch (IOException e) {
throw new Fault(e);
}
}

我有一个带有 handleMessage 方法的流后拦截器,如下所示:

public void handleMessage(Message message) throws Fault {

HttpServletResponse response = (HttpServletResponse) message
.get("HTTP.RESPONSE");

try {
response.getOutputStream().write(");".getBytes("UTF-8"));
} catch (IOException e) {
throw new Fault(e);
}

}

在预流拦截器中,我想根据是否抛出异常来设置回调包装器。不幸的是我想不出办法来做到这一点。我似乎无法读取预流拦截器中的消息内容。我也无法读取 HTTP 状态。非常感谢对此的一些帮助。要么如何具体解决我的问题,要么有更好的方法来解决它。

最佳答案

即使在异常情况下,服务也发送 200 有什么具体原因吗?我的意思是服务可以返回 500 并且消息可以由 GWT 客户端解析。

关于gwt - 创建供 GWT 客户端使用的 cxf REST json-p 服务的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9087139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com