如何使用Jersey / JAX-RS框架将Map
作为XML / JSON文档返回并不是那么明显。它已经支持List
,但就Map
而言,没有MessageBodyWriter
。即使我将Ma
嵌入到包装类中,XML模式中也没有map
类型。
有关如何将地图编组到Jersey中的XML / JSON文档的任何实用建议?
答案 0 :(得分:7)
在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<String, String> 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<Class<?>> getClasses() {
Set<Class<?>> 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<Class<?>> 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");
答案 1 :(得分:6)
我知道回复很晚,但我希望有一天能帮助别人:) 我应用的最简单,最快捷的修复方法是
@GET
@Path("/{messageId}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMessage(@PathParam("messageId") long id) {
Map<String, String> 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” }
这绝对可以帮助您解决问题。
答案 2 :(得分:5)
我知道已经有一段时间了,但也许有人会发现它很有用。
我遇到了类似的问题,而且看起来只有 Jackson 目前支持这种直接映射到JSON映射。
在 Jersey 中,它就像从资源方法返回地图一样简单:
@Path("myResource")
public class MyResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> getMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("some key", "some value");
return map;
}
}
并从客户端访问它:
// ... (client initialization)
Map<String, String> 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);
}
}
确保在classpath上有 Jersey Jackson模块。在maven中,只需添加:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>...</version>
</dependency>
没有maven,添加所有依赖项可能会有点棘手。 这就是全部,这应该有效。至少与 Jackson 提供商合作。
它在 Jettison 中对我不起作用,并且id在 MOXy 中无效(有issue打开)。
希望这有帮助。
答案 3 :(得分:1)
对我有用的解决方案(使用jettison):
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getJson() {
Map<String, String> testMap = new HashMap<>();
testMap.put("Key1", "value1");
testMap.put("key2", "value2");
JSONObject obj = new JSONObject(testMap);
return Response.status(200).entity(obj).build();
}
答案 4 :(得分:1)
默认情况下,Jersey使用MOXy XML / JSON提供程序。因此,如果您想使用MOXy,则需要添加单独的适配器。 简单的解决方案是,从pom.xml中删除MOXy依赖项并添加Jackson依赖项。杰克逊会照顾好一切。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>{latest version}</version>
</dependency>
抱歉,我不确定为什么MOXy是Jeresey的默认提供商。
public class BeanClass{
private int duration, Id;
private String description;
private User user = new User();
Map<String, String> map = new HashMap<>();
}
@GET
@Produces({ MediaType.APPLICATION_JSON }) // , MediaType.APPLICATION_XML
public Response getAll() {
List<BeanClass> lstBean = ...
return Response.ok().entity(lstBean).build();
}
谢谢,