我需要在每个请求的基础上漂亮地打印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);
}
}