创建供 GWT 客户端使用的 cxf REST json-p 服务的最佳方式
Posted
技术标签:
【中文标题】创建供 GWT 客户端使用的 cxf REST json-p 服务的最佳方式【英文标题】:Best way to create cxf REST json-p service to be used by a GWT client 【发布时间】:2012-02-23 14:53:37 【问题描述】:我们正在实现一个 REST api,它使用 CXF 和 Spring 返回 json-p。该服务应该与 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();
我有一个流内拦截器,它将成功和失败回调名称存储在 Message 对象的交换部分中,以便输出拦截器可以访问它们。它看起来像这样:
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 状态。非常感谢一些帮助。如何专门解决我的问题或解决问题的更好方法。
【问题讨论】:
【参考方案1】:即使出现异常,服务是否有任何特定原因发送 200。我的意思是服务可以返回500,消息可以被GWT客户端解析。
【讨论】:
以上是关于创建供 GWT 客户端使用的 cxf REST json-p 服务的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
[CXF REST标准实战系列] Spring4.0 整合 CXF3.0,实现测试接口(转)
java CXF客户端上传调用REST服务的文件(http://wwwdev.arag.it/webservices/sinistri/allega/?id_ds=83817&categori