que tenían el mismo problema hoy en día y no se rindieron hasta que encontré una muy buena solución adecuada. No puedo actualizar la biblioteca jersey de 1.1.5 es un sistema heredado. My Rest Service devuelve una lista y deben seguir esas reglas.
- listas vacías se representan como [] (casi imposible) Listas
- un elemento se representan como [] (configuración de asignación difícil pero solamente)
- Muchas listas de elementos se representan como [] (fácil)
Empieza de fácil a imposible.
3) nada hoy en día normal de Mapeo JSON
2) Registro JAXBContextResolver como la siguiente
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private final JAXBContext context;
private final Set<Class<?>> types;
private Class<?>[] ctypes = { Pojo.class }; //your pojo class
public JAXBContextResolver() throws Exception {
this.types = new HashSet<Class<?>>(Arrays.asList(ctypes));
this.context = new JSONJAXBContext(JSONConfiguration.mapped()
.rootUnwrapping(true)
.arrays("propertyName") //that should rendered as JSONArray even if the List only contain one element but doesn't handle the empty Collection case
.build()
, ctypes);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
return (types.contains(objectType)) ? context : null;
}
}
1) El siguiente método sólo funciona para la clase Colecciones $ EmptyList. Que encuentres una manera de hacerlo general para todas las colecciones, están vacías. Puede programar el código con EmptyList por lo tanto.
@Provider
@Produces(value={MediaType.APPLICATION_JSON})
public class EmptyListWriter implements MessageBodyWriter<AbstractList> {
private static final String EMPTY_JSON_ARRAY = "[]";
@Override
public long getSize(AbstractList list, Class<?> clazz, Type type, Annotation[] annotations, MediaType mediaType) {
return EMPTY_JSON_ARRAY.length();
}
@Override
public boolean isWriteable(Class<?> clazz, Type type, Annotation[] annotations, MediaType mediaType) {
return clazz.getName().equals("java.util.Collections$EmptyList");
}
@Override
public void writeTo(AbstractList list, Class<?> clazz, Type type, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> headers, OutputStream outputStream) throws IOException, WebApplicationException {
if (list.isEmpty())
outputStream.write(EMPTY_JSON_ARRAY.getBytes());
}
}
JAX-RS/Jersey no es compatible con la serialización de tipos primitivos o incluso los tipos de envoltura tales como Integer, Boolean etc. Que yo sepa, el enfoque que ha tomado parece ser única manera. –
Bien, ¡gracias! – Olvagor