6
Estoy tratando de implementar MessageBodyWriter para List. con esta implementación tengo una excepción de puntero nulo en línea; marshaller.marshal (o, entityStream);Jersey JAXB cómo implementar MessageBodyWriter para List
@Provider
@Produces(MediaType.APPLICATION_XML)
public class MyListProvider implements MessageBodyWriter<List<Instrument>> {
private String myWrapElemName = "datas";
private Marshaller marshaller;
public InstrumentModelListProvider(){
JAXBContext context;
try {
context = JAXBContext.newInstance(Data.class);
marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
//marshaller.setProperty(JMMarshallerImpl.JAXME_XML_DECLARATION, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
} catch (JAXBException e) {
System.err.println("/////////////"+e.getMessage());
//e.printStackTrace();
}
}
@Override
public long getSize(List<Data> as, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return -1;
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return MediaType.APPLICATION_XML_TYPE.equals(mediaType)
&& List.class.isAssignableFrom(type)
&& (((ParameterizedType)genericType).getActualTypeArguments()[0]).equals(Data.class);
}
@Override
public void writeTo(List<Data> list, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException, WebApplicationException {
Charset c = Charset.forName("UTF-8");
String cName = c.name();
entityStream.write(String.format("<?xml version=\"1.0\" encoding=\"%s\" standalone=\"yes\"?>", cName).getBytes(cName));
entityStream.write(String.format("<%s>", myWrapElemName).getBytes(cName));
for (Data o : list){
try {
marshaller.marshal(o, entityStream);
} catch(JAXBException exp) {
exp.printStackTrace();
//System.exit(-1);
}
}
entityStream.write(String.format("</%s>", myWrapElemName).getBytes(cName));
}
}
Usted no se ha ordenación de los datos o de objetos a entityStream más? ¿Cuál es la razón de tener ese buffer? – Lahniep
Creo que su error es cuando (Datos) o es nulo, y lo pone en la corriente –
No puede ser nulo en realidad ya que proviene de una iteración sobre una lista no vacía de objetos de Datos. – Lahniep