ConfigurableMoxyJsonProvider

ConfigurableMoxyJsonProvider

我需要在每个请求的基础上漂亮地打印MoxyJsonProvider生成的JSON或XML。
我在我的JAX-RS响应中添加了一个自定义HTTP标头“ pretty”,其值是从查询参数读取的true | false:

Response.ok(myEntity).header("pretty", params.getPretty()).build()


稍后,我自己的ConfigurableMoxyJsonProvider子类应处理此标头并调用setFormattedOutput(true)(或通过Marshaller属性JAXB_FORMATTED_OUTPUT)。但是,在涉及MessageBodyWriter分辨率时,我的ConfigurableMoxyJsonProvider子类始终会失去原始MOXy ConfigurableMoxyJsonProvider的隐含性。因此,永远不会调用类的writeTo或preWriteTo方法。

我如何获得类的preWriteTo()方法以对带有注释的所有资源起作用

@Produces({MediaType.APPLICATION_JSON, MediaType.WILDCARD, MediaType.APPLICATION_XML})


独立于某个类的类型。

我是否必须从应用程序中删除ConfigurableMoxyJsonProvider并注入我的?如果是这样,我该怎么做?

最佳答案

对于JSON绑定,您可以扩展MOXyJsonProvider(实现MessageBodyReader / MessageBodyWriter)并覆盖preWriteTo方法以检查标头,然后启用格式化的输出。

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.core.*;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

@Provider
public class ExtendedMOXyJsonProvider extends MOXyJsonProvider {

    @Override
    protected void preWriteTo(Object object, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller)
            throws JAXBException {
        Boolean isPretty = Boolean.valueOf((String) httpHeaders.getFirst("pretty"));
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isPretty);
    }

}

08-06 17:14