У меня есть следующий веб-сервис:
@Path("/storage-dirs/{user}")
@GET
@Produces(MediaType.APPLICATION_XML)
public JResponse<List<MarshalledMapEntry<String, Integer>>> getStorageDirs(@PathParam("user") String user) {
//List<MarshalledMapEntry<String, Integer>>
List<MarshalledMapEntry<String, Integer>> myEntries = new ArrayList<MarshalledMapEntry<String, Integer>>();
Map<String, Integer> originalEntries = DBAccessor.getStorageDirsForUser(user);
for (Map.Entry<String, Integer> en : originalEntries.entrySet()) {
myEntries.add(new MarshalledMapEntry<String, Integer>(en.getKey(), en.getValue().intValue()));
}
//GenericEntity<List<MarshalledMapEntry<String, Integer>>> entity = new GenericEntity<List<MarshalledMapEntry<String, Integer>>> {};
return JResponse.ok(myEntries).build();
}
А это мой MarshalledMapEntry:
@XmlRootElement
public class MarshalledMapEntry<K, V> {
@XmlElement
private K key;
@XmlElement
private V value;
MarshalledMapEntry() {} //JAXB requires it
public MarshalledMapEntry(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
Поскольку JAXB не поддерживает коллекцию как элементы верхнего уровня, я написал простой класс, который оборачивает карту. Но я получаю следующее исключение:
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<silverline.MarshalledMapEntry<java.lang.String, java.lang.Integer>>, and MIME media type application/xml was not found
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1437)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Как очевидно, я пытался использовать JResponse, чтобы избежать стирания типов List <>, но, поскольку у меня есть дженерики в моем классе Marshalled, я считаю, что это вызывает проблему. Итак, какое решение я могу реализовать, если я хочу иметь возможность вернуть универсальные карты. Если я изменю свой MarshalledMapEntry, чтобы я не использовал обобщенные типы, а вместо этого использовал String, String в качестве типов, но у меня может быть несколько разных типов Map, и я не хочу создавать копии этого класса только с измененными типами?