1

我真的不知道问题出在哪里,但我可以告诉以下内容:

首先我使用了 GWT RequestBuilder:

RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/myRESTResource/test");
rb.setHeader("Content-Type", "application/json");
rb.setRequestData("");
rb.setCallback(new RequestCallback() {
    @Override
    public void onResponseReceived(Request request, Response response) {
        Window.alert(response.getText());
    }
    @Override
    public void onError(Request request, Throwable exception) {
        Window.alert(exception);
    }
});
rb.send();

我的弹簧控制器:

@Controller
@RequestMapping("/myRESTResource")
public class TranslationController {
    @RequestMapping(value="/{param}", method=RequestMethod.GET)
    public @ResponseBody String get(@PathVariable("param") String param, HttpServletResponse response) {
        // get some data and output it as JSON
    }
}

在 Chrome 浏览器中,我可以看到以Content-type: text/html; charset=iso-8859-1. Window.alert()很好。

现在我想切换到restygwt。我正在使用Resource

Resource r = new Resource("myRESTResource/test");
r.get().send(new JsonCallback() {
    @Override
    public void onSuccess(Method method, JSONValue response) {
        Window.alert(response.toString());
    }

    @Override
    public void onFailure(Method method, Throwable exception) {
        Window.alert(exception.getLocalizedMessage());
    }
});

在这里,我的 Spring 控制器返回Content-type: application/json. 这Window.alert()对于 ASCII 字符来说很好,但所有特殊的东西都变成了一个黑盒子,里面有一个问号。该问题发生在 GWT 开发模式(带有集成 Jetty 的 Eclipse 4.2)中,并且还部署在外部 Tomcat 7 上。

如果我使用 restygwt 并放

response.setCharacterEncoding("ISO-8859-1");

在我的 Spring Controller 中,Window.alert()按预期显示数据。

很明显,我不想response.setCharacterEncoding("ISO-8859-1");在每个 Controller 方法中编写代码。

我希望有一个简单的方法来解决这个问题。谢谢你。

4

2 回答 2

1

解决方案非常简单:

Resource只需说出它想从服务器获取的编码的restygwt :

Accept: application/json; charset=utf-8

或者:

Accept: application/json; charset=iso-8859-1

代码示例:

HashMap<String, String> header = new HashMap<String, String>();
header.put(Resource.HEADER_ACCEPT, Resource.CONTENT_TYPE_JSON+"; charset=utf-8");

Resource r = new Resource("myRESTResource/test", header);
r.get().send(new JsonCallback() {
    @Override
    public void onSuccess(Method method, JSONValue response) {
        Window.alert(response.toString());
    }

    @Override
    public void onFailure(Method method, Throwable exception) {
        Window.alert(exception.getLocalizedMessage());
    }
});

Spring 会自动返回预期的编码!

于 2012-07-09T10:31:24.097 回答
0

哟似乎没有从服务器生成 json。你只是返回一个字符串。

尝试将其放入您的服务中:

@RequestMapping(value="/{param}", method=RequestMethod.GET**, produces = "application/json"**)

您可以使用 RestClient 之类的工具来验证服务器是否实际返回 json。

于 2012-11-01T20:18:27.697 回答