创建供 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 服务的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

在 gwt 中实现 REST 服务

CXF+Spring+Eclipse简明示例

[CXF REST标准实战系列] Spring4.0 整合 CXF3.0,实现测试接口(转)

cxf整合spring发布rest服务

java CXF客户端上传调用REST服务的文件(http://wwwdev.arag.it/webservices/sinistri/allega/?id_ds=83817&categori

使用CXF实现基于Rest方式的WebService(转)