Hallo,
ich versuche mich aktuell mit JAX-RS auf einem WildFly8 auseinander zu setzen.
Jetzt wollte ich einen REST-Endpoint erstellen, welcher verschiedene ArrayList-Objekte mit unterschiedlichen generischen Typen bereit stellen kann.
Ich bin aktuell soweit, das ich einen eigenen MessageBodyWriter erstellen muss. Für einzelen spezielle generische Typen klappt das auch alles wunderbar. Aber mir schwebt eine zentralle MessageBodyWriter Klasse vor, welche alle List-Objekte egal mit welchem generischen Typ verarbeiten kann.
@Provider
@Produces("application/xml")
public class Test_MessageBodyWriter implements MessageBodyWriter<List<?>> {
@Context
protected Providers providers;
...
@Override
public void writeTo(List<?> list, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
try{
Map<String,String> h = mediaType.getParameters();
Charset c = Charset.forName(h.get(MediaType.CHARSET_PARAMETER));
String cName = c.name();
JAXBContext ctx = null;
ContextResolver<JAXBContext> resolver = providers.getContextResolver(JAXBContext.class, mediaType);
if(resolver != null){
ctx = resolver.getContext(type);
}
if(ctx == null){
ctx = JAXBContext.newInstance(type);
}
Marshaller m = ctx.createMarshaller();
/*
JAXBContext context = JAXBContext.newInstance(type);
Marshaller m = context.createMarshaller();
*/
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.setProperty(Marshaller.JAXB_FRAGMENT, true);
entityStream.write(String.format("<?xml version=\"1.0\" encoding=\"%s\" standalone=\"yes\"?>", cName).getBytes(cName));
entityStream.write(String.format("<%s>", "list").getBytes(cName));
if(list.size() > 0){
JAXBContext.newInstance(list.get(0).getClass());
for (Object o : list){
m.marshal(o, entityStream);
}
}
entityStream.write(String.format("</%s>", "list").getBytes(cName));
} catch(Exception e){
e.printStackTrace();
}
}```
Leider funktioniert mein Ansatz nicht wirklich. Ich bekomme folgende Fehlermeldung.
`javax.xml.bind.JAXBException: Weder class de.test.TestClass noch eine der zugehörigen Superklassen ist diesem Kontext bekannt.`
Kann mir bitte jemand einen Tipp geben, worauf ich achten muss, um mein Vorhaben umzusetzen?
Grüße Hans