/ / ¿Cuál es la mejor manera de reemplazar JSONProvider (basado en Jettison) de CXF con MOXy? - json, cxf, eclipselink, moxy, jettison

¿Cuál es la mejor manera de reemplazar el JSONProvider de CXF (basado en Jettison) con MOXy? - json, cxf, eclipselink, moxy, jettison

Me preguntaba por qué MOXy no proporciona una clase JSONProvider similar a JACKSON para reemplazar el proveedor JSON predeterminado en una implementación jax-rs.

Esta sería la forma más fácil de tratar con todosClases en un determinado paquete. Lo que terminé haciendo fue hacer lo siguiente, ya que creo que la resolución de contexto personalizada o MessageBodyWriter / Reader son en su mayoría adecuados para manejar ciertas clases, pero no para manejar todas las clases en un paquete, especialmente si tiene muchas clases.

Estoy en lo cierto ¿Cuáles son tus pensamientos? ¿Cuál es la mejor manera de reemplazar Jettison con MOXy en CXF para manejar todas las clases en un paquete?

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();
}
}
}

Respuestas

2 para la respuesta № 1

EclipseLink JAXB (MOXy) ofrece el org.eclipse.persistence.jaxb.rs.MOXyJsonProvider Clase que puede usarse para habilitarla como el proveedor JSON.

A continuación se muestra un ejemplo de una clase de aplicación JAX-RS que configura 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;
}

}

MOXyJsonProvider Fue agregado en EclipseLink 2.4.0. La última versión es EclipseLink 2.4.1, que se puede descargar desde el siguiente enlace:

Para más información