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

时间:2017-08-14 09:49:20

标签: java jersey moxy

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

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

由于缺乏我的MOXy知识,我无法处理。我尝试了不同的方法,但没有找到解决方案。

我在2014年发现了similair问题here,遗憾的是到目前为止还没有回答......

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

1 个答案:

答案 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)而不是拦截器使用。