2010-06-17 6 views
6

Tengo un servicio web de descanso realmente simple que devuelve una lista de preguntas. Este código funciona como se espera cuando la cantidad de preguntas devueltas es mayor que cero. Pero si el servidor devuelve una matriz json vacía como [], JAXB crea una lista con una instancia de pregunta donde todos los campos están configurados como nulos.Jersey/JAXB: Desasignación de la matriz json vacía da como resultado una lista con un elemento donde todos los campos están definidos como nulos

Soy nuevo en Jersey y JAXB, así que no sé si no lo he configurado correctamente o si este es un problema conocido. ¿Algun consejo?

configuración del cliente:

DefaultApacheHttpClientConfig config = new DefaultApacheHttpClientConfig(); 
config.getProperties().put(DefaultApacheHttpClientConfig.PROPERTY_HANDLE_COOKIES, true); 
config.getClasses().add(JAXBContextResolver.class); 
//config.getClasses().add(JacksonJsonProvider.class); // <- Jackson causes other problems 

client = ApacheHttpClient.create(config); 

JAXBContextResolver:

@Provider 
public final class JAXBContextResolver implements ContextResolver<JAXBContext> { 

    private final JAXBContext context; 
    private final Set<Class> types; 
    private final Class[] cTypes = { Question.class }; 

    public JAXBContextResolver() throws Exception { 
    this.types = new HashSet(Arrays.asList(cTypes)); 
    this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes); 
    } 

    @Override 
    public JAXBContext getContext(Class<?> objectType) { 
    return (types.contains(objectType)) ? context : null; 
    } 

} 

El código de cliente:

public List<Question> getQuestionsByGroupId(int id) { 
    return digiRest.path("https://stackoverflow.com/questions/byGroupId/" + id).get(new GenericType<List<Question>>() {}); 
} 

La clase de pregunta es sólo un POJO simple.

+0

problema similar aquí. Resuelto (pero hacky): http://stackoverflow.com/questions/4197817 –

Respuesta

0

Sé que esta no es exactamente una respuesta a su pregunta, pero decidí usar GSON en la parte superior de la camiseta, para mis proyectos actuales. (y trato de evitar JAXB tanto como sea posible), y me pareció muy fácil y flexible.

sólo hay que declarar

@Consumes(MediaType.TEXT_PLAIN) 

o

@Produces(MediaType.TEXT_PLAIN) 

o ambos, y utilizar el contador de referencias GSON/unmarshaller, y trabajar con cadenas de civil. Muy fácil de depurar, unittest también ...

0

El uso de Jackson puede ayudar. Ver org.codehaus.jackson.map.ObjectMapper y org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_EMPTY

import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

public class SampleContextResolver implements ContextResolver<ObjectMapper> 
{ 
     @Override 
     public ObjectMapper getContext(Class<?> type) 
     { 
      ObjectMapper mapper = new ObjectMapper(); 

      mapper.setSerializationConfig(mapper.getSerializationConfig() 
       .withSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY) 
     } 
} 
Cuestiones relacionadas