我正在构建xAPI LRS的原型并使用Java / Jersey创建测试xAPI REST服务实现,最近的Jersey版本使用MOXy进行XML和JSON处理。
现在我正面临这个问题,根据规范,“POST”语句可以接受单个JSON语句或语句列表。
由于缺乏我的MOXy知识,我无法处理。我尝试了不同的方法,但没有找到解决方案。
我在2014年发现了similair问题here,遗憾的是到目前为止还没有回答......
有人可以提出一个解决方法我想继续使用MOXy吗?
答案 0 :(得分:0)
我通过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
注释一起工作,我在我的应用程序类中添加了寄存器(ArrayWrapperInterceptor.class
)。没有它 Jersey 不知道它,并且使用@Provider注释我的拦截器是全局的。
也许这不是最好的解决方案,但现在它看起来像是我唯一可用的解决方案。
稍后我将尝试研究在我的资源方法中使用某些动态对象的可能性(如JSON
object)而不是拦截器使用。