/ / Qual é a melhor maneira de substituir o JSONProvider da CXF (baseado no Jettison) com o MOXy? - json, cxf, eclipselink, moxy, jettison

Qual é a melhor maneira de substituir o JSONProvider da CXF (baseado no Jettison) com o MOXy? - json, cxf, eclipselink, moxy, jettison

Eu queria saber por que o MOXy não está fornecendo uma classe JSONProvider semelhante ao JACKSON para substituir o provedor JSON padrão em uma implementação de jax-rs?

Esta seria a maneira mais fácil de lidar com todosclasses em um determinado pacote. O que acabei fazendo foi fazer o seguinte, pois acho que o resolvedor de contexto personalizado ou o MessageBodyWriter / Reader são mais adequados para lidar com certas classes, mas não para lidar com todas as classes de um pacote, especialmente se você tiver muitas classes.

Estou certo? Quais são seus pensamentos? Qual é a melhor maneira de substituir o Jettison pelo MOXy no CXF para lidar com todas as classes de um pacote?

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

Respostas:

2 para resposta № 1

EclipseLink JAXB (MOXy) oferece o org.eclipse.persistence.jaxb.rs.MOXyJsonProvider classe que pode ser usada para ativá-lo como o provedor JSON.

Abaixo está um exemplo de uma classe de aplicativo 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 foi adicionado no EclipseLink 2.4.0. A versão mais recente é EclipseLink 2.4.1, que pode ser baixada no seguinte link:

Para maiores informações