我想知道为什么MOXy没有提供类似于JACKSON的JSONProvider类来替换jax-rs实现中的默认JSON提供程序?
这是处理某个包中所有类的最简单方法。 我最终做的是做以下事情,因为我觉得自定义上下文解析器或MessageBodyWriter / Reader主要适合处理某些类,但不处理包中的所有类,特别是如果你有很多类。
我是对的吗? 你的想法是什么? 在CXF中使用MOXy替换Jettison以处理包中的所有类的最佳方法是什么?
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.cxf.jaxrs.provider.json.JSONProvider;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
public class MyJSONProvider<T> extends JSONProvider<T> {
private static JAXBContext jaxbContext = null;
static {
try {
jaxbContext = JAXBContextFactory.createContext("com.bp.bs", null);
} catch (JAXBException jaxbe) {
jaxbe.printStackTrace();
throw new ExceptionInInitializerError(jaxbe);
}
}
@Override
public void writeTo(T obj, Class<?> cls, Type genericType,
Annotation[] anns, MediaType m,
MultivaluedMap<String, Object> headers, OutputStream os)
throws IOException, WebApplicationException {
Marshaller marshaller = null;
try {
marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE,
"application/json");
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
marshaller.marshal(obj, os);
} catch (JAXBException jaxbe) {
jaxbe.printStackTrace();
}
}
}
答案 0 :(得分:2)
EclipseLink JAXB (MOXy)提供org.eclipse.persistence.jaxb.rs.MOXyJsonProvider
类,可用于将其作为JSON提供程序启用。
以下是配置MOXyJsonProvider
。
package org.example;
import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;
public class CustomerApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> set = new HashSet<Class<?>>(2);
set.add(MOXyJsonProvider.class);
set.add(CustomerService.class);
return set;
}
}
在EclipseLink 2.4.0中添加了 MOXyJsonProvider
。最新版本是EclipseLink 2.4.1,可以从以下链接下载:
了解更多信息