Jersey / JAX-RS:将地图作为XML / JSON返回
如何使用Jersey / JAX-RS框架将Map
作为XML / JSON文档返回并不是那么明显。 它已经支持List
,但是当涉及到Map
,没有MessageBodyWriter
。 即使我将Ma
嵌入到包装类中,XML模式中也没有map
类型。
关于如何将Map编组到Jersey中的XML / JSON文档的任何实用建议?
我知道它的回复很晚,但我希望它有一天会帮助某人:)我应用的最简单,最快捷的修复方法是
@GET @Path("/{messageId}") @Produces(MediaType.APPLICATION_JSON) public Response getMessage(@PathParam("messageId") long id) { Map map = new HashMap<>(); map.put("1", "abc"); map.put("2", "def"); map.put("3", "ghi"); return Response.status(Status.OK).entity(map).build(); }
输出:{“1”:“abc”,“2”:“def”,“3”:“ghi”}
这绝对可以帮助您解决问题。
在Java EE 7中执行此操作非常容易。
REST资源类:
package com.mycompany.maptojson.rest; import java.util.HashMap; import java.util.Map; import javax.ws.rs.Path; import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.enterprise.context.RequestScoped; @Path("maps") @RequestScoped public class MapToJson { @GET @Produces("application/json") public Map getJson() { Map theMap = new HashMap<>(); theMap.put("foo", "bar"); return theMap; } }
Application
:
package com.mycompany.maptojson.rest; import java.util.Set; import javax.ws.rs.core.Application; @javax.ws.rs.ApplicationPath("webresources") public class ApplicationConfig extends Application { @Override public Set> getClasses() { Set> resources = new java.util.HashSet<>(); // following code can be used to customize Jersey 2.0 JSON provider: try { Class jsonProvider = Class.forName("org.glassfish.jersey.jackson.JacksonFeature"); // Class jsonProvider = Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature"); // Class jsonProvider = Class.forName("org.glassfish.jersey.jettison.JettisonFeature"); resources.add(jsonProvider); } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex); } addRestResourceClasses(resources); return resources; } private void addRestResourceClasses(Set> resources) { resources.add(com.mycompany.maptojson.rest.MapToJson.class); } }
如您所见,您可以将不同的类配置为jsonProvider
:
Class.forName("org.glassfish.jersey.jackson.JacksonFeature");
要么
Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature");
要么
Class.forName("org.glassfish.jersey.jettison.JettisonFeature");
我知道已经有一段时间了,但也许有人会发现它很有用。
我遇到了类似的问题,而且看起来,只有jackson目前支持这种直接的Map to JSON映射。
在Jersey中 ,它就像从资源方法返回地图一样简单:
@Path("myResource") public class MyResource { @GET @Produces(MediaType.APPLICATION_JSON) public Map getMap() { Map map = new HashMap(); map.put("some key", "some value"); return map; } }
并从客户端访问它:
// ... (client initialization) Map map = client.target().path("myResource").request("application/json").get(Map.class);
使用Jackson (而不是MOXy ),您需要手动注册JacksonFeature
,例如在javax.ws.rs.core.Application
子类(或Jersey中的 ResourceConfig
)中:
public class MyApp extends ResourceConfig { public MyApp() { super(MyResource.class, JacksonFeature.class); } }
并且一定要在类路径上安装Jersey Jackson模块 。 在maven中,只需添加:
org.glassfish.jersey.media jersey-media-json-jackson ...
没有maven,添加所有依赖项可能会有点棘手。 这就是全部,这应该有效。 至少与jackson提供商。
它在Jettison中对我不起作用,id在MOXy中不起作用 (打开了一个问题 )。
希望这可以帮助。
对我有用的解决方案(使用jettison):
@GET @Produces(MediaType.APPLICATION_JSON) public Response getJson() { Map testMap = new HashMap<>(); testMap.put("Key1", "value1"); testMap.put("key2", "value2"); JSONObject obj = new JSONObject(testMap); return Response.status(200).entity(obj).build(); }
默认情况下,Jersey使用MOXy XML / JSON提供程序。 因此,如果您想使用MOXy,则需要添加单独的适配器。 简单的解决方案是,从pom.xml中删除MOXy依赖项并添加Jackson依赖项。 jackson将照顾一切。
org.glassfish.jersey.media jersey-media-json-jackson {latest version}
对不起,我不确定为什么MOXy是Jeresey的默认提供商。
public class BeanClass{ private int duration, Id; private String description; private User user = new User(); Map map = new HashMap<>(); } @GET @Produces({ MediaType.APPLICATION_JSON }) // , MediaType.APPLICATION_XML public Response getAll() { List lstBean = ... return Response.ok().entity(lstBean).build(); }
谢谢,