gpt4 book ai didi

java - Jersey:JSON 和 StringMessageProvider 冲突,application/json 方法生成无效的 JSON

转载 作者:行者123 更新时间:2023-11-29 05:19:35 32 4
gpt4 key购买 nike

我在 jetty+jersey 上有一个 jax-rs 网络服务,并尝试了不同的 JSON 消息提供程序(例如 Jackson 和 Gson)。对于所有这些,POJO <-> JSON 都可以正常工作,但方法如下:

@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 调用失败。我希望它是

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

产生这种魔力的原因是 StringMessageProvider(基本类型的内部 jersey 提供程序之一)具有 / Produce/Consume 注释。而且我不想侵入 Jersey 内部供应商。我想强制 Jersey 首先使用 JSON 提供程序?

有什么想法吗?

最佳答案

所以,在阅读 Jersey 文档和一些调试之后,结果是:

  • 是的,自定义消息的读者/作者有更高的优先级,但是
  • 选择“合适的”提供商(从正确的提供商开始)后, Jersey 通过自定义比较对它们进行排序,首先检查“类型”距离

因此,具有方法返回类型“String”和 JSON 消息提供程序 MIME 类型通配符 (/),它首先通过比较距离 String-String 检查 StringMessageProvider(内置类型的默认 jersey 提供程序) < 字符串对象。

通过添加非通用自定义消息提供程序解决的问题,例如:

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

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

在这个返回的字符串被转义为正确的 JSON 并被浏览器的 ajax 调用处理程序识别之后。

关于java - Jersey:JSON 和 StringMessageProvider 冲突,application/json 方法生成无效的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25311472/

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