泽西岛:JSON和StringMessageProvider冲突,应用程序/json方法生成无效的JSON [英] Jersey: JSON and StringMessageProvider clash, application/json methods generate invalid JSON

查看:71
本文介绍了泽西岛:JSON和StringMessageProvider冲突,应用程序/json方法生成无效的JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在jetty + jersey上有一个jax-rs网络服务,并尝试了不同的JSON消息提供程序(例如Jackson和Gson). 通过所有这些,POJO<-> JSON可以很好地工作,但是这样的方法:

I have a jax-rs web services on jetty+jersey and tried different JSON message providers (e.g. Jackson and Gson). With all of them POJO <-> JSON works just fine but methods like this:

@GET
@Path("test")
@Produces(MediaType.APPLICATION_JSON)
public String test() {
    return "This string should be \"quoted\" by message writer";
}

产生字符串

This string should be "quoted" by message writer

这当然不是有效的JSON,并且会导致浏览器的ajax调用失败. 我希望是

which is of course not a valid JSON and causes browser's ajax calls to fail. I expect it to be

"This string should be \"quoted\" by message writer"

之所以如此神奇,是因为StringMessageProvider(基本类型的内部球衣提供程序之一)具有/ Produce/Consume注释.而且我不想侵入球衣内部提供商.我想强制球衣首先使用JSON提供程序吗?

The reason for such magic is StringMessageProvider (one of the internal jersey providers for basic types) which have / Produce/Consume annotation. And I don't want to hack into jersey internal providers. I want to force jersey to use JSON provider in first place?

有什么想法吗?

推荐答案

因此,阅读球衣文档&一些调试结果表明:

So, after reading jersey docs & some debuging it turned out that:

  • 是的,自定义消息阅读器/编写器具有更高的优先级,但是
  • 选择合适的"提供者(从正确的提供者开始)后,球衣通过自定义比较对它们进行排序,首先检查类型"距离

因此,具有方法返回类型'String'和JSON消息提供程序MIME类型通配符(/),它通过比较距离String-String来检查第一个StringMessageProvider(内置类型的默认球衣提供程序) <字符串对象.

So, having method return type 'String' and JSON message provider MIME type wildcard (/), it checks first StringMessageProvider (default jersey provider for build-in type) by comparing distances String-String < String-Object.

通过添加非通用自定义消息提供程序(例如:

The problem solved by adding non-generic custom message provider, e.g.:

public class StringProvider extends GsonProvider<String> {
    public StringProvider() {}
}

(其中GsonProvider implements MessageBodyReader<T>, MessageBodyWriter<T>).

将此返回的字符串转义为正确的JSON,并被浏览器的ajax调用处理程序识别.

After this returned string was escaped to be a correct JSON and recognized by browsers' ajax call handlers.

这篇关于泽西岛:JSON和StringMessageProvider冲突,应用程序/json方法生成无效的JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆