Я знаю, что qasting довольно старый, но я наткнулся на похожую проблему, но я хотел отобразить список массивов, т. Е. «Список» из-за результата из базы данных, полученной из jpa, и нативного запроса без использования сущностей ,
Вот как я это решил:
Сначала создал ListWrapper.java:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class ListWrapper extends ArrayList {
@SuppressWarnings("unchecked")
public ListWrapper() {
super();
}
public ListWrapper(List list) {
super(list);
}
}
А потом я создал класс, расширяющий AbstractMessageReaderWriterProvider
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider;
@Provider
@Produces("*/*")
@Consumes("*/*")
public class ListObjectArrayMessagereaderWriterProvider extends AbstractMessageReaderWriterProvider<ListWrapper> {
public boolean supports(Class type) {
return type == ListWrapper.class;
}
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return type == ListWrapper.class;
}
@Override
public ListWrapper readFrom(Class<ListWrapper> type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
throw new IllegalArgumentException("Not implemented yet.");
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return type == ListWrapper.class;
}
@SuppressWarnings("unchecked")
@Override
public void writeTo(ListWrapper t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
final Iterator<Object[]> iterator = t.iterator();
OutputStreamWriter writer = new OutputStreamWriter(entityStream, getCharset(mediaType));
final JSONArray jsonArrayOuter = new JSONArray();
while (iterator.hasNext()) {
final Object[] objs = iterator.next();
JSONArray jsonArrayInner = new JSONArray(Arrays.asList(objs));
jsonArrayOuter.put(jsonArrayInner);
}
try {
jsonArrayOuter.write(writer);
writer.write("\n");
writer.flush();
} catch (JSONException je) {
throw new WebApplicationException(new Exception(ImplMessages.ERROR_WRITING_JSON_ARRAY(), je), 500);
}
}
}
Тогда я использовал его как a:
@GET
@Path("/{id}/search")
@Produces(JSON)
public ListWrapper search(@PathParam("id") Integer projectId ) {
return DatabaseManager.search(projectId);
}
Метод поиска возвращает Listwrapper со списком Object []
Надеюсь, это кому-нибудь поможет: -)