2010-06-17 5 views
6

Ho un semplice servizio web di restituzione che restituisce un elenco di domande. Questo codice funziona come previsto quando il numero di domande restituite è maggiore di zero. Ma se il server restituisce un array json vuoto come [], JAXB crea un elenco con un'istanza di domanda in cui tutti i campi sono impostati su null!Jersey/JAXB: Unmarshalling di array json vuoto restituisce un elenco con un elemento in cui tutti i campi sono impostati su null

Sono nuovo sia per Jersey che per JAXB, quindi non so se non l'ho configurato correttamente o se si tratta di un problema noto. Qualche consiglio?

configurazione del client:

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

} 

Codice cliente:

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

La classe questione è solo un semplice POJO.

+0

problema simile qui. Risolto (ma hacky): http://stackoverflow.com/questions/4197817 –

risposta

0

So che questa non è esattamente una risposta alla tua domanda, ma ho scelto di usare GSON in cima alla maglia, per i miei progetti attuali. (e cerco di evitare JAXB il più possibile) e l'ho trovato molto facile e resistente.

Non vi resta che dichiarare

@Consumes(MediaType.TEXT_PLAIN) 

o

@Produces(MediaType.TEXT_PLAIN) 

o entrambi, e utilizzare il GSON marshaller/unmarshaller, e lavorare con le stringhe semplici. Molto facile da eseguire il debug, anche unittest ...

0

Utilizzare Jackson può aiutare. Vedi org.codehaus.jackson.map.ObjectMapper e 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) 
     } 
}