gpt4 book ai didi

java - Jersey MOXy 接受同一资源的单个 JSON 值和数组

转载 作者:太空宇宙 更新时间:2023-11-04 11:14:08 27 4
gpt4 key购买 nike

我正在构建 xAPI LRS 原型(prototype),并使用 Java/Jersey 创建测试 xAPI REST 服务实现,最近的 Jersey 版本使用 MOXy 进行 XML 和 JSON 处理。

现在我面临的问题是,根据规范,POST 的“语句”资源可以接受单个 JSON 语句或语句列表。

我无法处理这个问题,因为我缺乏 MOXy 知识。我尝试了不同的方法,但没有找到解决方案。

我发现类似的问题here日期为 2014 年,不幸的是到目前为止还没有得到答复...

任何人都可以提出一个我想继续使用 MOXy 的解决方法吗?

最佳答案

我通过 ReaderInterceptor 管理了一些解决方法

@ArrayWrapper
public class ArrayWrapperInterceptor implements ReaderInterceptor {
public ArrayWrapperInterceptor() {
openingCurlyBrace = Pattern.compile("\\A\\s*\\{");
closingCurlyBrace = Pattern.compile("\\}\\s*\\Z");
}
@Override
public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
InputStream is = context.getInputStream();
String content = "";
while (is.available() != 0) {
byte[] bytes = new byte[is.available()];
is.read(bytes);
content = content + new String(bytes);
}
if (content.length() > 0 && openingCurlyBrace.matcher(content).find() && closingCurlyBrace.matcher(content).find()) {
content = "[" + content + "]";
}
context.setInputStream(new ByteArrayInputStream(content.getBytes()));
return context.proceed();
}
private Pattern openingCurlyBrace;
private Pattern closingCurlyBrace;
}

我定义了这个注释

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface ArrayWrapper {}

并将其放在两个地方(拦截器和我的 POST 资源方法)。

为了使拦截器仅与 @ArrayWrapper 注释配合使用,我已将 register(ArrayWrapperInterceptor.class) 添加到我的应用程序类中。没有它,Jersey 不会意识到它,并且使用 @Provider 注释,我的拦截器是全局的。

也许这不是最好的解决方案,但现在看来它是我唯一可用的解决方案。

稍后我将尝试研究在资源方法中使用某些动态对象(例如 JSON 对象)而不是使用拦截器的可能性。

关于java - Jersey MOXy 接受同一资源的单个 JSON 值和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45671817/

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